< 山东大学软件学院项目实训 > 渲染引擎系统(一)
目录
前言
本阶段任务
一、主要工作
二、具体实现
1.获取预计算输出图片
2.逐像素获取BRDF数据
3.还原图像
前言
本项目希望实现一个基础渲染器,同时能够支持使用预计算。
项目地址
本阶段任务
本月主要任务为技术准备,从而为后续研究提供技术支持:
1、辐射预计算的研究;
2、市场现有的后降噪处理 SDK 的技术探究。
一、主要工作
处理光照预结算结果,应用双向反射分布函数(BRDF)将其还原为实时渲染的最终结果。
二、具体实现
1.获取预计算输出图片
2.逐像素获取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数据×预计算图像的像素值,最终输出的结果即为实际场景中实时光照渲染的图像。
< 山东大学软件学院项目实训 > 渲染引擎系统(一)相关推荐
- 山东大学软件学院项目实训-创新实训-SDUMeeting(一)
山东大学软件学院项目实训-创新实训-SDUMeeting(一) 一.前言: 这个项目是山东大学视频会议项目,这个项目基于webrtc构建多人视频会议系统,我负责视频会议客户端及服务端安全防护,这个专栏 ...
- 山东大学软件学院项目实训-创新实训-SDUMeeting(三)
山东大学软件学院项目实训-创新实训-SDUMeeting(三) 山大会议项目web安全之文件注入防护 一.前言 山大会议的客户端加入了对用户自定义头像的支持,需要用户自行上传头像图片,这个过程存在文件 ...
- 山东大学软件学院项目实训-创新实训-SDUMeeting(六)
山东大学软件学院项目实训-创新实训-SDUMeeting(六) 端对端加密与密钥交换 端到端加密(end-to-end),是一种只有参与通讯的用户可以读取信息的通信系统.它可以防止潜在的窃听者--包括 ...
- 山东大学软件学院项目实训-创新实训-网络安全靶场实验平台(一)
目录 前言 一.项目介绍 二.项目框架 三.个人分工 四.本周任务完成情况 4.1 Vue安装 4.1.1 node.js安装及配置 4.1.2 安装vue及脚手架 4.1.3 运行Vue项目 4. ...
- 2021年山东大学软件学院项目实训记录(第一周)
这次项目实训中,我们小组选择的题目是在线考试系统,经过讨论分工,我负责考试管理部分中的前端开发部分. 首先进行环境配置. 前端开发最为便利的开发工具为VScode,我们选择的开发框架是Vue. VSc ...
- 山东大学软件学院项目实训-创新实训-山大软院网络攻防靶场实验平台(二)-docker安装与学习
目录 前言: 一.docker安装 1.centos7使用yum安装 二.命令行创建 docker 容器测试 前言: 项目实训立项通过后的几天均在学习 docker 的相关知识,上一篇文章也简单记述了 ...
- 山东大学软件学院项目实训-创新实训-山大软院网络攻防靶场实验平台(六)-SQL注入数字型
目录 前言: 一.SQL 注入漏洞简介 1.简介 2.危害 3.利用 4.防范 二.相关配置 三.编写"SQL 注入漏洞-数字型注入"后端代码 1.使用 springboot 框架 ...
- 山东大学软件学院项目实训——超市/供应商直销平台
了解项目: 项目介绍: 一.项目名称:直销超市/供应商网络平台 直销超市/供应商网络平台是一个企业对企业(B2B)模式的在线交易平台.考虑到了买卖双方各种需求,有着广泛的实用性,能简单,清晰,快捷的满 ...
- 山东大学软件学院项目实训-创新实训-网络安全靶场实验平台(五)
目录 一.header 二.footer 三.数据库的设计 3.1 表的设计 3.2 E-R图 一.header header是页面的导航条,作为一个组件在每个页面中都有引用. 其外观如下图所示: ...
最新文章
- 我对于js注入的理解
- 通过Spring配置文件中bean中的property赋值
- 网站图片优化的小技巧分享
- 最新动态,电信屏蔽Godaddy部分DNS服务
- LINUX 对引导加密
- 这种动作片还需要汽车特效?
- 使用SharpZipLib.dll压缩zip
- 基于Java+SpringBoot+vue+element实现前后端分离牙科诊所管理系统详细设计
- ux和ui_使用UX设计师为Amazon的Alexa学习会话式UI的基础
- ECCV 2020 论文大盘点-图像与视频分割篇
- linux 如何选择新的内核,如何更新内核??__boot_内核_vmlinuz_linux_System__169IT.COM
- linux表白程序源码,程序员表白程序,开放源码在此!
- hash函数(哈希表)
- Android最新flash播放器----支持安卓5.0+系统。
- node.js学习笔记(8)--multer模块文件上传
- 硬禾课堂 - 一分钟焊接小技巧
- 何为A站、B站、C站、D站、F站
- 小技巧分享:电脑屏幕亮度怎么调?
- 网页直播源码IM即时通讯协议
- c语言 code table,单片机C语言unsigned char code table是什么意思?
热门文章
- 微信html开发返回刷新页面,解决微信内置浏览器返回上一页强制刷新问题方法...
- 最强大脑(9-10)
- LSTM 航空乘客预测单步预测的两种情况
- CAD图纸怎么转换成清晰的JPG格式图片
- 同创永益CTO郑阳受邀在清华MEM大讲堂分享“混沌工程在复杂业务稳定性中的应用”
- Android Manager之SensorManager(传感器)—方向传感器(Orientation sensor)
- CDH集成Kerberos配置
- 简易短信发送器iSMS
- LittleTools之批量替换工具
- 微服务02——RPC协议