我在OpenGL ES2.0中看到了许多关于照明的不同教程。
有些人使用顶点着色器做所有的照明和转换,然后只是通过片段着色最后的颜色。
另一些则从顶点着色器传递位置和其他变量,然后执行片段着色器中的所有照明。
根据我的经验,我一直认为照明应该在零碎着色器。有人能告诉我为什么要这样做吗?
发布于 2014-08-20 22:50:04
传统的固定管道OpenGL确实点亮了顶点,只是插入了每个片段.因此,它倾向于显示沿边缘可见的接缝:

然而,这被认为是一个可以接受的折衷方案,因为每个像素的照明成本太高。硬件现在更好了,但是每个像素的照明费用仍然更高。所以我想这里有一个潜在的争论。此外,我想,如果你试图模仿旧的固定管道,你可能故意做不准确的照明。
然而,我很难想象任何特别复杂的算法都是可以接受的。你看到的例子是否可能只是做一些事情,比如计算出每个顶点的切线和余切向量,或者其他一些类似的昂贵步骤,然后对每个像素进行插值,并在其中进行绝对的最终计算?
发布于 2014-08-24 16:32:40
照明计算可能相当昂贵。由于在绘制典型模型时,碎片比顶点多,所以在顶点着色器中进行光照计算并对结果进行插值通常更有效。除了执行着色器的纯数量之外,在片段着色器中执行典型的照明计算也需要更多的操作,因为插值的正常需要重新标准化,这需要相对昂贵的sqrt操作。
每个顶点照明的缺点是,如果光照值在表面上迅速变化,它的工作效率很低。这是完全合理的,因为这些值是在三角形之间线性内插的。如果所需的值不沿三角形近似线性变化,这将引入工件。
典型的例子是镜面高光。如果您定义了具有相对锐利/小的镜面高光的发光材料,则可以很容易地看到高光的亮度在变化,而对象是动画的。它看起来也像是在物体上“徘徊”的亮点。例如,如果你旋转一个有镜面高光的球体围绕它的中心,高光应该保持完全相同。但是在每一个顶点的照明下,高光的亮度会增加或减少,并且会轻微摆动。
有两种主要的方法可以避免这些影响,或者至少将它们降低到不再让人感到不安的程度:
哪种解决方案更好,需要逐案决定。当然,使用更精细的镶嵌会增加几何处理方面的开销,而使用每段照明则会增加片段着色器的开销。
当你想要应用像凹凸贴图这样的效果时,每个顶点的照明变得更加困难,在那里,光照值在表面上变化非常快。在这种情况下,几乎没有办法使用每片段照明。
我已经看到了建议,说明GPU是如此之快,现在每个顶点照明不应该再使用。我认为这是一个严重的简化。即使你能在每片照明下获得所需的性能,现在大多数电脑/设备都是电池供电的。为了提高效率,使你的渲染尽可能高效是非常重要的。我相信仍然有一些用例,其中每个顶点照明是最有效的方法。
https://stackoverflow.com/questions/25415603
复制相似问题