我有一个 OpenGL ES 着色器,里面有一些制服。我在片段着色器中对制服进行了一些数学运算。着色器编译器通常会优化制服上的这些表达式,以便它们发生一次而不是每个像素吗?或者我应该在着色器之外进行计算并将结果传入?
具体来说,我将三个统一坐标传递给着色器:
uniform vec2 u_a;
uniform vec2 u_b;
uniform vec2 u_c;
然后我计算这些点之间的一些向量:
vec2 v0 = u_c - u_a;
vec2 v1 = u_b - u_a;
我很好奇着色器编译器是否可以优化这些,使得它们在每次渲染时发生一次,或者我是否应该在着色器之外计算这些并将它们作为额外的制服传递。当然,对于优化,我应该真正测量一些东西以找出我的具体情况的差异(因为 GPU 在每个像素上执行此操作的速度可能比我的 CPU 更快),但我对着色器编译器有多大范围感兴趣通常像这样的优化。
如果您知道 Android/iPhone 设备上的着色器编译器可能会有不同的行为,或者不同的 GLSL 版本会有所不同,则可以加分。