目录

前言

本阶段任务

一、主要工作

二、具体实现

1.获取预计算输出图片

2.逐像素获取BRDF数据

3.还原图像


前言

本项目希望实现一个基础渲染器,同时能够支持使用预计算。

项目地址

本阶段任务

本月主要任务为技术准备,从而为后续研究提供技术支持:
1、辐射预计算的研究;
2、市场现有的后降噪处理 SDK 的技术探究。

一、主要工作

处理光照预结算结果,应用双向反射分布函数(BRDF)将其还原为实时渲染的最终结果。

二、具体实现

1.获取预计算输出图片

具体流程详见辐射预计算

2.逐像素获取BRDF数据

在辐射预计算过程中,从屏幕像素发射光线,打中场景中的点,并进行光照辐射预计算。

在进行还原的过程中,对屏幕图像进行逐像素处理,根据既定的映射方向代入双向反射分布函数(BRDF),每个屏幕像素使用规定阈值范围中心点的BRDF值,获取BRDF的输出数据。

本项目中使用迪士尼的BRDF模型,详情可见迪士尼BRDF。

analytic
# variables go here...
# [type] [name] [min val] [max val] [default val]
::begin parameters
color baseColor .82 .67 .16
float metallic 0 1 0
float subsurface 0 1 0
float specular 0 1 .5
float roughness 0 1 .5
float specularTint 0 1 0
float anisotropic 0 1 0
float sheen 0 1 0
float sheenTint 0 1 .5
float clearcoat 0 1 0
float clearcoatGloss 0 1 1
::end parameters::begin shaderconst float PI = 3.14159265358979323846;float sqr(float x) { return x*x; }float SchlickFresnel(float u)
{float m = clamp(1-u, 0, 1);float m2 = m*m;return m2*m2*m; // pow(m,5)
}float GTR1(float NdotH, float a)
{if (a >= 1) return 1/PI;float a2 = a*a;float t = 1 + (a2-1)*NdotH*NdotH;return (a2-1) / (PI*log(a2)*t);
}float GTR2(float NdotH, float a)
{float a2 = a*a;float t = 1 + (a2-1)*NdotH*NdotH;return a2 / (PI * t*t);
}float GTR2_aniso(float NdotH, float HdotX, float HdotY, float ax, float ay)
{return 1 / (PI * ax*ay * sqr( sqr(HdotX/ax) + sqr(HdotY/ay) + NdotH*NdotH ));
}float smithG_GGX(float NdotV, float alphaG)
{float a = alphaG*alphaG;float b = NdotV*NdotV;return 1 / (NdotV + sqrt(a + b - a*b));
}float smithG_GGX_aniso(float NdotV, float VdotX, float VdotY, float ax, float ay)
{return 1 / (NdotV + sqrt( sqr(VdotX*ax) + sqr(VdotY*ay) + sqr(NdotV) ));
}vec3 mon2lin(vec3 x)
{return vec3(pow(x[0], 2.2), pow(x[1], 2.2), pow(x[2], 2.2));
}vec3 BRDF( vec3 L, vec3 V, vec3 N, vec3 X, vec3 Y )
{float NdotL = dot(N,L);float NdotV = dot(N,V);if (NdotL < 0 || NdotV < 0) return vec3(0);vec3 H = normalize(L+V);float NdotH = dot(N,H);float LdotH = dot(L,H);vec3 Cdlin = mon2lin(baseColor);float Cdlum = .3*Cdlin[0] + .6*Cdlin[1]  + .1*Cdlin[2]; // luminance approx.vec3 Ctint = Cdlum > 0 ? Cdlin/Cdlum : vec3(1); // normalize lum. to isolate hue+satvec3 Cspec0 = mix(specular*.08*mix(vec3(1), Ctint, specularTint), Cdlin, metallic);vec3 Csheen = mix(vec3(1), Ctint, sheenTint);// Diffuse fresnel - go from 1 at normal incidence to .5 at grazing// and mix in diffuse retro-reflection based on roughnessfloat FL = SchlickFresnel(NdotL), FV = SchlickFresnel(NdotV);float Fd90 = 0.5 + 2 * LdotH*LdotH * roughness;float Fd = mix(1.0, Fd90, FL) * mix(1.0, Fd90, FV);// Based on Hanrahan-Krueger brdf approximation of isotropic bssrdf// 1.25 scale is used to (roughly) preserve albedo// Fss90 used to "flatten" retroreflection based on roughnessfloat Fss90 = LdotH*LdotH*roughness;float Fss = mix(1.0, Fss90, FL) * mix(1.0, Fss90, FV);float ss = 1.25 * (Fss * (1 / (NdotL + NdotV) - .5) + .5);// specularfloat aspect = sqrt(1-anisotropic*.9);float ax = max(.001, sqr(roughness)/aspect);float ay = max(.001, sqr(roughness)*aspect);float Ds = GTR2_aniso(NdotH, dot(H, X), dot(H, Y), ax, ay);float FH = SchlickFresnel(LdotH);vec3 Fs = mix(Cspec0, vec3(1), FH);float Gs;Gs  = smithG_GGX_aniso(NdotL, dot(L, X), dot(L, Y), ax, ay);Gs *= smithG_GGX_aniso(NdotV, dot(V, X), dot(V, Y), ax, ay);// sheenvec3 Fsheen = FH * sheen * Csheen;// clearcoat (ior = 1.5 -> F0 = 0.04)float Dr = GTR1(NdotH, mix(.1,.001,clearcoatGloss));float Fr = mix(.04, 1.0, FH);float Gr = smithG_GGX(NdotL, .25) * smithG_GGX(NdotV, .25);return ((1/PI) * mix(Fd, ss, subsurface)*Cdlin + Fsheen)* (1-metallic)+ Gs*Fs*Ds + .25*clearcoat*Gr*Fr*Dr;
}::end shader

3.还原图像

将获得的BRDF数据×预计算图像的像素值,最终输出的结果即为实际场景中实时光照渲染的图像。

(上为光线追踪结果,下为预计算结果)

< 山东大学软件学院项目实训 > 渲染引擎系统(一)相关推荐

  1. 山东大学软件学院项目实训-创新实训-SDUMeeting(一)

    山东大学软件学院项目实训-创新实训-SDUMeeting(一) 一.前言: 这个项目是山东大学视频会议项目,这个项目基于webrtc构建多人视频会议系统,我负责视频会议客户端及服务端安全防护,这个专栏 ...

  2. 山东大学软件学院项目实训-创新实训-SDUMeeting(三)

    山东大学软件学院项目实训-创新实训-SDUMeeting(三) 山大会议项目web安全之文件注入防护 一.前言 山大会议的客户端加入了对用户自定义头像的支持,需要用户自行上传头像图片,这个过程存在文件 ...

  3. 山东大学软件学院项目实训-创新实训-SDUMeeting(六)

    山东大学软件学院项目实训-创新实训-SDUMeeting(六) 端对端加密与密钥交换 端到端加密(end-to-end),是一种只有参与通讯的用户可以读取信息的通信系统.它可以防止潜在的窃听者--包括 ...

  4. 山东大学软件学院项目实训-创新实训-网络安全靶场实验平台(一)

    目录 前言 一.项目介绍 二.项目框架 三.个人分工 四.本周任务完成情况 4.1  Vue安装 4.1.1 node.js安装及配置 4.1.2 安装vue及脚手架 4.1.3 运行Vue项目 4. ...

  5. 2021年山东大学软件学院项目实训记录(第一周)

    这次项目实训中,我们小组选择的题目是在线考试系统,经过讨论分工,我负责考试管理部分中的前端开发部分. 首先进行环境配置. 前端开发最为便利的开发工具为VScode,我们选择的开发框架是Vue. VSc ...

  6. 山东大学软件学院项目实训-创新实训-山大软院网络攻防靶场实验平台(二)-docker安装与学习

    目录 前言: 一.docker安装 1.centos7使用yum安装 二.命令行创建 docker 容器测试 前言: 项目实训立项通过后的几天均在学习 docker 的相关知识,上一篇文章也简单记述了 ...

  7. 山东大学软件学院项目实训-创新实训-山大软院网络攻防靶场实验平台(六)-SQL注入数字型

    目录 前言: 一.SQL 注入漏洞简介 1.简介 2.危害 3.利用 4.防范 二.相关配置 三.编写"SQL 注入漏洞-数字型注入"后端代码 1.使用 springboot 框架 ...

  8. 山东大学软件学院项目实训——超市/供应商直销平台

    了解项目: 项目介绍: 一.项目名称:直销超市/供应商网络平台 直销超市/供应商网络平台是一个企业对企业(B2B)模式的在线交易平台.考虑到了买卖双方各种需求,有着广泛的实用性,能简单,清晰,快捷的满 ...

  9. 山东大学软件学院项目实训-创新实训-网络安全靶场实验平台(五)

    目录 一.header 二.footer 三.数据库的设计 3.1 表的设计 3.2 E-R图 一.header header是页面的导航条,作为一个组件在每个页面中都有引用. 其外观如下图所示:   ...

最新文章

  1. 我对于js注入的理解
  2. 通过Spring配置文件中bean中的property赋值
  3. 网站图片优化的小技巧分享
  4. 最新动态,电信屏蔽Godaddy部分DNS服务
  5. LINUX 对引导加密
  6. 这种动作片还需要汽车特效?
  7. 使用SharpZipLib.dll压缩zip
  8. 基于Java+SpringBoot+vue+element实现前后端分离牙科诊所管理系统详细设计
  9. ux和ui_使用UX设计师为Amazon的Alexa学习会话式UI的基础
  10. ECCV 2020 论文大盘点-图像与视频分割篇
  11. linux 如何选择新的内核,如何更新内核??__boot_内核_vmlinuz_linux_System__169IT.COM
  12. linux表白程序源码,程序员表白程序,开放源码在此!
  13. hash函数(哈希表)
  14. Android最新flash播放器----支持安卓5.0+系统。
  15. node.js学习笔记(8)--multer模块文件上传
  16. 硬禾课堂 - 一分钟焊接小技巧
  17. 何为A站、B站、C站、D站、F站
  18. 小技巧分享:电脑屏幕亮度怎么调?
  19. 网页直播源码IM即时通讯协议
  20. c语言 code table,单片机C语言unsigned char code table是什么意思?

热门文章

  1. 微信html开发返回刷新页面,解决微信内置浏览器返回上一页强制刷新问题方法...
  2. 最强大脑(9-10)
  3. LSTM 航空乘客预测单步预测的两种情况
  4. CAD图纸怎么转换成清晰的JPG格式图片
  5. 同创永益CTO郑阳受邀在清华MEM大讲堂分享“混沌工程在复杂业务稳定性中的应用”
  6. Android Manager之SensorManager(传感器)—方向传感器(Orientation sensor)
  7. CDH集成Kerberos配置
  8. 简易短信发送器iSMS
  9. LittleTools之批量替换工具
  10. 微服务02——RPC协议