《图形特效编程》课堂记录02
本节课讲了高级纹理的应用以及渲染管线的灯光部分。
高级纹理应用
切线空间
切线空间是以顶点为原点,顶点法线、uv坐标方向的三个正交单位向量组成的向量空间。
法线贴图、视差贴图需要在法线空间下进行计算。
切线空间的计算
通常来说我们拿到的顶点数据只能直接得到顶点的法线信息,而uv坐标是一个二维向量,那么应该如何计算切线空间呢?
下面给出过程:
https://blog.csdn.net/u010385624/article/details/91994006
TBN矩阵
TBN矩阵是切线Tangent、副切线Bitangent、法线Normal组成的变换矩阵,用于将向量变换到切线空间。
凹凸贴图 Bump Mapping
法线贴图 Normal Mapping
对法线进行扰动,从而影响光照模型的计算结果。
优点
- 性能好
缺点
- 效果相对一般
- 纹理接缝处可能处理不好
法线贴图的存储
由于图像信息的像素值[0,1],而法线各分量的取值范围为[-1,1].
因此在存储时需要将法线信息转换为颜色信息
$ pixel = (normal+1) / 2 $
使用时则需要对法线贴图进行解析。
$ normal = pixel * 2 - 1$
法线贴图的使用
根据法线贴图的rgb通道信息重组法线,并用于后续的光照计算。
置换贴图(位移贴图) Displacement Mapping
根据贴图信息在GeometryShader阶段中对模型进行细分。
优点
- 效果好
缺点
- 增加了面数,性能差。通常不用在游戏中。
视差贴图 Parallax Mapping
视差贴图其实是置换贴图的一种。需要使用一张高度图(Height Map)定义模型表面的高度。根据视角实际看到的位置对uv做适当的偏移,使用该uv采样Height Map。
优点
- 性能相对Displacement Mapping好
- 效果比Normal mapping好
缺点
- 需要在片元着色器中写迭代算法,有损性能。
视差贴图的其他应用
视差贴图也可用于制作平面的室内效果,视差卡牌等特效。
渲染管线中的灯光
顶点着色Vertex Lit
前向渲染ForwardLighting
前向渲染先遍历每个灯光,后遍历场景中的物体。
1 | foreach light in lights: |
延迟渲染DeferedLighting
延迟渲染优先遍历场景中的每一个物体,将法线、深度等信息记录到缓冲区(GBuffer)中,最后根据GBuffer中的所有信息进行着色。
1 | foreach object in scene: |
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 Derek's Blog!