发送GL制服:多个浮点数与打包到矢量中

时间:2014-01-27 05:52:53

标签: opengl glsl webgl shader

假设我有四个要发送到着色器的浮点值,以下哪种是发送它们的最佳方式。

将它们作为单独的花车发送:

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会自动打包制服还是我应该照顾好自己?

2 个答案:

答案 0 :(得分:2)

有多种方法可以将统一变量发送到GPU。您拥有的API调用越少越好,这将减少应用程序中的状态更改,并且对于更大的块而不是更频繁的更小块,复制数据的频率会降低。管理较少数量的统一变量也更容易;所以使用矢量,这是一个双赢的局面。

如果您使用较新的OpenGL版本3.2+,还有其他方法可以复制制服: 当你有更多的制服时,到GPU。

例如,使用 Uniform blocks ,如果您有一大块统一变量将在多个着色器中使用,并且您不打算在它们上面写。如果使用多个着色器,统一块也会减少复制操作的数量,您可以复制一次并多次使用它们。

另一方面,如果您的应用程序正在写入,请使用 shader storage block (在OpenGL 4.3+中可用)。

答案 1 :(得分:0)

does OpenGL/OpenGLES/WebGL automatically pack uniforms or is it something I should take care of myself?

  • 不,GL不负责任何包装,必须以特定方式进行。