优化片段和顶点着色器之间的操作

时间:2019-05-10 20:31:06

标签: opengl graphics vertex-shader pixel-shader

我正在学习使用OpenGL创建图形引擎。我想知道,是否应该将重复操作从顶点着色器移到片段着色器,因为据我了解,顶点着色器每个顶点仅运行一次?

例如,当对光方向的向量进行归一化时,由于此光在整个顶点中是相同的,是否应将其移动到顶点着色器,而不是为每个像素计算它?将它保留在片段着色器中是否有特定的原因?

1 个答案:

答案 0 :(得分:1)

如果计算完全相同:是的,通常在顶点着色器中执行此操作应该比片段着色器更有效。在某些情况下效率可能更高:

  • 当绘制几何导致阴影像素少于可变形顶点时-由于密集的几何或极端的丢弃/遮挡。如果是这种情况,通常您会希望通过切换到较低细节级别的几何图形或更智能的几何图形剔除来解决它。

  • 在顶点着色器中进行计算时,需要您将更多数据发送到片段着色器,才能使用计算结果。发送更多数据的速度可能较慢,因为它需要更多的内存操作,并且光栅化器需要在每个多边形上插值更多的“可变”值。

对于光照计算,尤其要注意,将计算从片段着色器移动到顶点着色器会影响渲染的质量。特别是,在“变化”插值后,每个顶点处的归一化方向矢量会变短,如果直接使用而不进行重新归一化,则三角形内部会稍微变暗。而且,当然,将整个光照计算移至顶点着色器的效果甚至更大。

但是这些效果的可见性取决于纹理的频率,几何形状的分辨率,屏幕的大小,灯光的距离等。在某些情况下,质量/性能之间的权衡是有意义的。