OpenGL着色器统一变量优化

3

我想要优化我的着色器,我想知道uniform上的计算是如何被着色器处理的。 确切地说,我想知道是否应该在CPU上计算这些内容并将准备好的结果作为uniform发送,还是可以在着色器中计算而不会对性能造成重大损失。

例如,我有一个简单的着色器像这样:

uniform vec2 screenSize;
vec2 pixelSize = vec2(1.0, 1.0) / screenSize;

void main()
{
//... some code that is using pixelSize, for example for reading something from sampler2D
}

在每个OpenGL绘制调用中,例如对于全屏大小的四边形(后处理效果),着色器将计算多少次pixelSize

也许这取决于是顶点着色器还是片段着色器?


通过使用glslang运行整个着色器程序并使用SPIRV-Tools进行优化,来检查所得到的SPIR-V?该SPIR-V将与最终在GPU上运行的内容相近,加上/减去特定管线状态配置允许的其他优化。 - genpfault
我使用OpenGL编译着色器(glCreateShader,glShaderSource,glCompileShader)。 - Raffallo
1个回答

3

说到底,这一切都将被实现定义。一个实现可能会在使用该着色器和这些统一变量进行渲染时,在 CPU 上找到从均匀值完全派生的每种表达式的所有可能情况并对其进行预计算。本质上,它可能会发明另一个统一变量值,该值在呈现调用之前被计算。

然而,我不会依赖于这一点。同时...我可能不会太在意。任何非平凡的着色器都将花费大量时间处理非均匀数据。例如,如果您的着色器正在获取半打纹理(甚至只有一个),那么在统一变量上执行倒数操作的成本将是一个舍入误差。

只需做出合理的判断即可。不要在统一变量上执行显然昂贵的操作,因为这比您在 CPU 上计算它们更容易编程。与此同时,除非您真正遇到性能问题,否则不要担心执行一些轻微的操作。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接