本节课讲了高级纹理的应用以及渲染管线的灯光部分。

高级纹理应用

切线空间

切线空间是以顶点为原点,顶点法线、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
2
3
4
foreach light in lights:
foreach object in scene:
render object ......
end

延迟渲染DeferedLighting

延迟渲染优先遍历场景中的每一个物体,将法线、深度等信息记录到缓冲区(GBuffer)中,最后根据GBuffer中的所有信息进行着色。

1
2
3
4
5
6
foreach object in scene:
record object info
end
foreach light in lights:
shading ......
end