在顶点着色器中声明常量而不是文字。 标准的做法,还是不必要的严格?

在一个顶点着色器中 ,当然有一个统一的存储空间是有限的,而且我的理解是不同的系统可能在编译代码的时候以稍微不同的方式实现GLSL。 我听说过build议使用常量,而不是在顶点着色器代码中写出文字。

例如,下面的代码可能会导致可用统一存储的减less。 (我不太明白。)

示例1:使用文字

vec4 myVector = vec4(1.0, 0.0, 0.0, 1.0); 

就我的理解而言,每次使用1.00.0会占用一定数量的统一存储空间。 因此,build议将以前的代码转换成如下所示的代码:

例2:用常量而不是文字

 const float zero = 0.0; const float one = 1.0; vec4 myVector = vec4(one, zero, zero, one); 

有没有人了解背后的理由? 我没有任何代码问题,我只是想正确地理解这些东西,以便将来没有问题。

我的正式问题如下:特别是对于使用OpenGL ES 2.0iOS平台,最好的做法是用文字(例子1)或常量(例子2)写出东西。 我是否应该花时间每次用常量写出东西,或者如果顶点着色器无法正确编译,应该写出文字和只使用常量?

谢谢!

对于Kimi提到的在规范中没有find任何内容, OpenGL®ES着色语言规范的附录A-7包含以下内容:

在计算使用的统一variables的数量时,在计算存储需求时,包括预处理后着色源中的任何文字常量。 相同常数的多个实例应计数多次。

这可能是Kimi引用的“OpenGL®ES 2.0编程指南”中build议的来源。

然而,规范并没有强制规定这个限制,据推测任何实现都可以自由地改进,但我无法find关于iOS GL驱动程序的任何方法。

我很好奇,有没有人真的跟上了文字重载的示例着色器的想法,试图达到任何潜在的最大统一限制?

(对不起…我本来打算发表这个答案作为评论,基米的答案,但没有所需的50个代表点)。

从OpenGL®ES 2.0编程指南

就字面值而言,OpenGL ES 2.0着色语言规范指出不假设传播是不变的。 这意味着相同字面值的多个实例将被多次计数。 应该声明适当的constvariables,而不是使用文字值。 这避免了多次使用相同的文字值,这可能会导致顶点着色器在顶点统一存储需求超过实现支持的情况下无法编译。

在实际的规格中我找不到与此相关的任何内容。 也没有特定于iOS的信息。

你也可以检查一个GLSL优化工具来解决这个问题(和其他许多问题)。