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

5
在顶点着色器中,有一定数量的统一存储空间可用,我了解到不同的系统可能会以稍微不同的方式实现GLSL来编译代码。我听说推荐在顶点着色器代码中使用常量而不是写出字面量。
例如,以下代码可能会导致可用的统一存储空间减少。(我不太明白为什么。)
示例1:使用字面量
vec4 myVector = vec4(1.0, 0.0, 0.0, 1.0);

据我理解,每次使用1.00.0都可能占用一定的统一存储空间。因此,建议将先前的代码更改为以下形式:示例2:使用常量而不是字面值
const float zero = 0.0;
const float one = 1.0;

vec4 myVector = vec4(one, zero, zero, one);

有人了解这背后的争论吗?我没有代码问题,只是想正确理解这些内容,以便将来不会出现问题。
我的正式问题如下:特别是对于使用OpenGL ES 2.0的iOS平台,是使用文字(示例1)还是常量(示例2)写出这个东西的最佳实践。我应该花时间每次都用常量写出来,还是只有在顶点着色器无法编译时才使用常量?
谢谢!

你能看一下二进制文件,看看有没有任何差异吗? - Carl Norum
2个回答

3
关于Kimi提到的规范中没有找到任何内容,OpenGL® ES Shading Language规范的附录A-7包括以下内容:

在计算使用的一致变量数量时,在预处理后的着色器源代码中存在的任何文字常量都包含在计算存储要求时。相同常量的多个实例应该计数多次。

这可能是Kimi引用OpenGL® ES 2.0编程指南中推荐的来源。
然而,规范并不强制执行此限制,据推测任何实现都可以改进它,但我无法找到任何关于iOS GL驱动程序的具体信息。
我很好奇,有人是否真正尝试过在样本着色器中使用文字常量来达到潜在的最大一致变量限制?

1

来自OpenGL® ES 2.0编程指南

就字面值而言,OpenGL ES 2.0着色语言规范说明不假定常量传播。这意味着相同字面值的多个实例将被多次计算。应声明适当的const变量,而不是使用字面值。这避免了相同的字面值多次计数,如果顶点统一存储要求超过实现支持的范围,则可能导致顶点着色器无法编译。

我在实际规范中找不到任何相关信息。此外,也没有关于iOS的具体信息。

您还可以检查一个GLSL优化器工具,用于解决此问题(以及许多其他问题)。


谢谢Kimi,这正是我在阅读时遇到的问题。我可能会输入一堆文字并查看是否在某个时刻无法编译,然后将它们替换为常量并查看是否更改。我在阅读编程指南时的想法是,作者可能试图提出适用于所有平台的建议,因此我基本上想知道顶点着色器编译器的iOS实现是否关注此问题。这不是一个非常紧急的问题,但如果我找到答案,我会发布它。 - Mike

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