假设我有四个要发送到着色器的浮点值,以下哪种是发送它们的最佳方式.
将它们作为单独的浮动发送:
uniform float uniformValue1;
uniform float uniformValue2;
uniform float uniformValue3;
uniform float uniformValue4;
void main()
{
//do shader stuff here
}
将它们打包成一个矢量:
uniform vec4 uniformValues;
void main()
{
//do shader stuff here
}
我偶然发现了这个文件:https://www.khronos.org/webgl/public-mailing-list/archives/1003/pdf7z773meQcF.pdf
关于这个问题的讨论有一点我想知道:OpenGL / OpenGLES / WebGL会自动打包制服还是应该照顾好自己?
最佳答案 有多种方法可以将统一变量发送到GPU.您拥有的API调用越少越好,这将减少应用程序中的状态更改,并且对于更大的块而不是更频繁的更小块,复制数据的频率会降低.管理较少数量的统一变量也更容易;所以使用矢量,这是一个双赢的局面.
如果您使用较新的OpenGL版本3.2,还有其他方法可以复制制服:
到GPU,当你有更多的制服.
例如,如果您有一大块将在多个着色器中使用的统一变量,并且您不打算在它们上面写,则使用Uniform blocks.如果使用多个着色器,统一块也将减少复制操作的数量,您可以复制一次并多次使用它们.
另一方面,如果您的应用程序正在写入它们,请使用shader storage block(在OpenGL 4.3中可用).