GSN Composer:Shader Monthly
时间:2023年8月31日14:01:48
链接:
- 课程主页:https://www.youtube.com/@gsn-composer
- 编程练习:https://www.gsn-lib.org/
- 课件:https://www.uni-marburg.de/en/fb12/research-groups/grafikmultimedia/lectures/graphics
P1 What are Shaders?
Shader:告诉计算机如何渲染场景的计算机程序
- 通常是并行执行
- 在GPU上运行(GPU,Graphics Processing Unit)
实践
绿色节点:数据
蓝色节点:计算节点
P2 Perspective Projection in GLSL
URL:https://www.youtube.com/watch?v=_pGik1nuZbw
本节概述:
- 讲解小孔成像
- 推导透视投影矩阵
透视投影
相机看向-z轴,因此-Z>0
欧几里得和投影空间
OpenGL管线
OpenGL透视投影
远平面的点被映射到NDC z=1的地方;近平面的点被映射到NDC z=-1的地方
P7 Procedural Textures
URL:https://www.youtube.com/watch?v=6VCSaOYEcOo
程序纹理:
- 不占显存
- 不受分辨率影响
SDF
锯齿
SDF 抗锯齿(推导看不懂,死记)
红线:
- 在圆内的程度,用于平滑边界。
- 采样中心完全在圆内返回1,完全在圆外返回0,介于二者之间返回插值。
- 未知,需要求
SDF:纹理坐标空间计算(连续)
抗锯齿填充函数:像素坐标空间(离散)
黄线:由像素空间对SDF计算得到的,相当于用离散去平滑连续。
- 翻转后 + 0.5 就是红线
fwidth研究
1
2
3 >ddx(v) = 该像素点右边的值 - 该像素点的值
>ddy(v) = 该像素点下面的值 - 该像素点的值
>fwidth(v) = abs(ddx(v)) + abs(ddy(v)) //邻域像素之间的近似导数值fwidth可视化:可以发现在45度的位置偏差绝对值之和最大。水平和竖直值最小。
P8 Procedural Noise
URL:https://www.youtube.com/watch?v=jkYIOu8HddA
在邻近随机值之间进行双线性插值
Value Noise
顶点着色器
1 |
|
片段着色器
1 |
|
Gradiance Noise
在梯度之间插值随机值
顶点
1 |
|
片段
1 |
|
P9 Microfacet BRDF
Microfacet BRDF: Theory and Implementation of Basic PBR Materials [Shaders Monthly #9]:https://www.youtube.com/watch?v=gya7x9H3mV0
其他优质链接
- Physics and Math of Shading | SIGGRAPH Courses:https://www.youtube.com/watch?v=j-A0mwsJRmk
Fresnel reflectance
宏观Fresnel
perpendicular:垂直的
举例:当光线垂直从空气入射到玻璃内时,有4%的光线被反射,96%被折射
不同波长Fresnel反射的比例不同
微观Fresnel
主要在θ1的确定
Normal distribution function
观察可以发现,法线分布函数取决于==法线n==和==半程向量h==
Geometry term
Cook-Torrance Microfacet BRDF
实践
顶点
1 |
|
片元
1 |
|
P10 Importance Sampling
本节在间接光漫反射部分就引入重要性采样(实际就是半球上均匀采样,只是采样点由计算机随机生成)
- 而Learn OpenGL文档对间接光漫反射的采样点是人为定义的,均匀采样半球表面,因此文档该节没有引入importance sampling。
引入
对于IBL(基于图像的照明),传入的辐射率Li存储在2D环境图像中
本节采用球形环境贴图。我们需要对半球表面进行积分,得到间接光漫反射入射Radiance。需要用到重要性采样。
重要性采样
黎曼和
蒙特卡罗积分和重要性采样配合使用
- 可以发现如果采样使用均匀分布的概率密度函数,结果就是黎曼和
当p(x)不是均匀分布,而满足某种特定分布时,就是重要性采样。最理想的p(x)是和函数形状一致,即p(x)要满足在f(x)值大的地方大。这是因为积分结果受函数值大的地方影响较大。
下一步,如何得到近似的p(x)?
逆变换采样
均匀分布的随机数值转换到其他分布
目标:已知仅能从均匀分布采样,需要求从p(x)分布的采样
u服从均匀分布,x服从p(x)分布
pdf最大值,cdf斜率最大。取逆后相反。
IBL Lambert Diffuse
根据BRDF写
将积分转为蒙特卡罗积分
- 要使得分母的p(x)尽可能和f(x)一样,但是L
i没有解析式,因此p(x)设为c cosθ sinθ
根据p(x)积分=1,求c,得到p的表达式
由于联合分布不依赖于phi,因此直接对phi进行均匀采样,而p(θ)使用逆变换采样得到
间接光漫反射结论 记!
间接光漫反射和观察方向无关,因此生成的IBL后续使==用法线方向采样==
其中u
n和vn服从 0~1均匀分布
实践
纹理坐标映射到球坐标
球坐标映射到笛卡尔坐标
代码:https://www.gsn-lib.org/index.html#projectName=ShadersMonthly10&graphName=PrefilterDiffuse
P11 Image-based Lighting (IBL) of PBR Materials
回顾
引入
间接光反射部分生成的IBL,==用H向量采样==。由于D的存在,因此应该借助D实现重要性采样
反射公式
![image-20230901151330769](GSN Composer:Shader Monthly.assets/image-20230901151330769.png)
h和n越近,镜面反射越强;h和n越远,镜面反射越弱
GGX 重要性采样
验证pdf = 1
采样可视化
- pdf取决于D,这意味着随机生成的h会接近法线,入射光和出射光会沿H对称
- 下图中的太阳光源不用管,这里的采样已知的只有v和n,输出为h和l(原因详见结论)
其中 u,v ~ (0, 1) 均匀分布
增加粗糙度,采样结果更随机
改变积分变量
θ是L和N的夹角,现在希望换成H和法线的夹角
间接光镜面反射结论 记!
需要预先知道v和n才能采样得到Lo,导致无法直接预计算用于实时处理。
分离近似求和
1) Pre-Filtered Envmap
随机采样法线附近的H,以法线法向为观察方向V,计算反射方向L,使用L对环境贴图采样,得到Pre-Filtered Envmap
![image-20230901185341519](GSN Composer:Shader Monthly.assets/image-20230901185341519.png)
1 | vec3 prefilterEnvMapSpecular(in sampler2D envmapSampler, in vec2 tex) { |
2) BRDF Integration Map
以法线为观察方向V,且设$\phi=0$(各向同性性质,$\phi$不重要),随机采样法线附近的H,代公式
1 | // adapted from "Real Shading in Unreal Engine 4", Brian Karis, Epic Games |
预计算完整代码
漫反射预处理环境贴图:使用n采样
镜面反射预处理环境贴图:使用多个反射rv采样
顶点
1 |
|
片段
1 |
|