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)写出东西。我应该每次都花时间用常量写出东西,还是应该写出文字并且只在顶点着色器无法正确编译时使用常量?

谢谢!

4

2 回答 2

3

关于 Kimi 提到在规范中找不到任何内容,OpenGL® ES 着色语言规范的附录 A-7 确实包括以下内容:

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

这可能是Kimi 引用的OpenGL® ES 2.0 Programming Guide中建议的来源。

但是,该规范并没有强制执行此限制,并且可能任何实现都可以对其进行免费改进,但我找不到任何关于 iOS GL 驱动程序的方法。

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

(对不起...我打算将此答案作为对 Kimi 答案的评论发布,但还没有所需的 50 Rep 积分)。

于 2013-10-04T02:14:25.287 回答
1

来自OpenGL® ES 2.0 编程指南

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

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

您还可以查看为解决此问题(以及许多其他问题)而编写的GLSL 优化器工具。

于 2012-12-20T10:54:00.987 回答