OpenGL3.3_C++_Windows(36)
PBR_IBL镜面部分
- 镜面部分并不能像漫反射部分一样将常量提取出来,因为它受到wi和w0的影响,就比如一个x的等式,不能把x部分提取出来一样,他是随着等式变化的
- 但是如果放在等式中,计算所有的可能性,计算量会极大,我们把镜面部分再次拆分为两个部分
- 分割求和近似法(split sum approximation):预滤波环境贴图(辐照度) + BRDF积分贴图
预滤波环境贴图(镜面部分):
- 这次会考虑粗糙度,因为对于不同粗糙度的表明会使用不同的mip图采样
- 粗糙度越高,采样越分散,贴图越模糊,将保存到不同的mipmap级别的贴图中,
- 为了确保为其 mip 级别分配足够的内存,一个简单方法是调用 glGenerateMipmap(GL_TEXTURE_CUBE_MAP)。
- GL_LINEAR_MIPMAP_LINEAR 启用三线性过滤
- mip 级别每增加一级,尺寸缩小为一半。
流程
- 如果使用均匀的半球采样,计算镜面部分的辐照度,效果会很差,镜面反射依赖于表面的粗糙度,形成镜面波瓣,如果以类似方式选取采样向量将是有意义的,这个过程称为重要性采样。
- 因为镜面的辐照度图应该和视角有关,对于采样方向和散射强度,通过DNF--BRDF中的法线分布函数生成,公式受法线,h(半程),a粗糙度影响
- 如果要预计算,我们并不知道视角方向,如果我们假设视角方向==输出采样方向w0,这个部分中就不用考虑视角方向,从而预计算,虽然效果不是很好
重要性采样:
- 具有更快收敛速度的采样
-
蒙特卡洛积分(纯随机):
-
蒙特卡洛积分:离散的解决问题,不必考虑所有
-
在 a 到 b 上采样 N 个随机样本的子集,求和并求平均数,pdf 代表概率密度函数
-
随着样本数量的不断增加,我们最终将收敛到积分的精确
-
估算是有偏的,集中于特定的值或方向
-
-
低差异序列(均匀):
-
该序列生成的仍然是随机样本,但样本分布更均匀:具有更快的收敛速度,它们会以更快的速度收敛到精确解,这使得它对于性能繁重的应用很有用。
-
Hammersley 序列:该序列是把十进制数字的二进制表示镜像翻转到小数点右边而得
-
GGX几何函数 重要性采样:
-
我们需要一些方法定向和偏移采样向量,以使其朝向特定粗糙度的镜面波瓣方向:
-
有别于均匀或纯随机地,采样会根据粗糙度,偏向微表面的半向量的宏观反射方向,将 GGX NDF应用到采样中。并和随机(低差异)序列值配合使用
预过滤卷积的伪像:接缝和亮点:
-
较低的 mip 级别具有更低的分辨率,并且预过滤贴图代表了与更大的采样波瓣卷积,因此缺乏立方体的面和面之间的滤波的问题就更明显:
-
可以启用 GL_TEXTURE_CUBE_MAP_SEAMLESS,以为我们提供在立方体贴图的面之间进行正确过滤的选项:
-
对镜面反射进行卷积需要大量采样,才能正确反映 HDR 环境反射的混乱变化。
-
我们可以在预过滤卷积时,不直接采样环境贴图,而是基于积分的 PDF 和粗糙度采样环境贴图的 mipmap
BRDF积分贴图:
- 假设每个方向的入射辐射度L都是白色的,在给定粗糙度、光线 ωi 法线 nn 夹角 n⋅ωi 的情况下,可以预计算结果,
- 使用RGB通道的纹理,R为菲涅耳响应的系数,G为偏差值,
n⋅ωi为横坐标,粗糙度作为纵坐标 - 需要生成一张 512 × 512 分辨率的 2D 纹理
- 对于brdf部分,我们可以再次移项变换和近似,将得到这个公式
合成最终颜色:
- ……