当我看到法线贴图的一种实现,该实现在顶点着色器中计算TBN矩阵并将所有内容(尤其是视图矢量和光照矢量)转换为该阶段的切线空间时,似乎是正确的方法。这样,片段着色器中就不再需要矩阵向量乘积了。

输入基于图像的照明:对于我们要从图像中获取的每个片段,通常是一个或多个立方体贴图纹理,来自某些方向的光强度。我假设这些数据在世界空间中。

我的问题是:是否可以在保留上述顶点着色器变换优化的同时使用IBL?


它在我看来,我们仍然需要将获取方向从切线空间转换为世界空间(或立方体贴图所在的空间)。
相反,如果我们想在世界空间中工作(如延迟着色),则需要变换每个片段的法线。

IBL是否必然意味着每个片段至少有一个矩阵向量乘法,而我提到的优化是一种不常见的情况,还是我错过了一些东西?

#1 楼

是的,您确实需要将获取方向转换为立方体贴图的空间。如果您能以某种方式找出顶点着色器中的提取方向,则可以在那里进行转换,但是那样会产生更差的光照。

对于较小数量的内插值来说也值得进行优化。顶点着色器和像素着色器之间的距离(而不是像素着色器中较少的矩阵矢量乘法)。一旦有了一个要转换的视图矢量和两个必须进行插值的转换光矢量(否则它们将是常数),就匹配了要插入的切线/双切线/法线矩阵的大小。与在着色器中执行额外的矩阵乘法相比,这可能会对性能产生更大的影响。