假设我有四个浮点值想要发送到着色器,以下哪一个是发送它们的最佳方式。
将它们作为单独的花车发送:
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块,如果您有一大块将在多个着色器中使用的uniform变量,并且您不会在它们上写入。如果您使用多个着色器,统一块也会减少复制操作的次数,您可以复制一次并多次使用它们。
另一方面,如果您的应用程序要在其上写入,请使用 着色器存储块(在 OpenGL 4.3+ 中可用)。
OpenGL/OpenGLES/WebGL 会自动打包制服吗?还是我应该自己处理?
不,GL 不负责任何包装,必须以特定于应用程序的方式进行。