声明常量,而不是字面的顶点着色器。 标准的做法,或不必要的严谨性?(Declaring cons

2019-07-17 11:08发布

顶点着色器 ,当然还有允许统一存储量有限,这是我的理解是不同的系统可以实现编译代码方面稍微不同的方式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.0iOS平台,是写出来与文字的东西的最佳实践(例如1),或者用常数(例如2)。 我应该把我的时间写出来的东西,每个每次常数,或者我应该写出来的文字,如果顶点着色器无法正确编译只使用常数?

谢谢!

Answer 1:

关于关于规范没有找到任何雷克南提到,附录A-7 的的OpenGL®ES着色语言规范不包括以下内容:

当计算用于均匀变量的数量,存在于预处理后的着色器源的任何文字常数计算的存储要求时包括在内。 相同的常量的多个实例应该算多次。

这可能是在推荐的来源的OpenGL ES 2.0编程指南基米引用。

然而,该规范并没有规定这个限制,想必任何实现可以自由地改善它,但我无法找到任何关于iOS的GL驱动两种方式。

我很好奇,有没有人实际上是在超载的文字样本着色器,企图达成任何潜在的最大的统一限值的想法跟进?

(对不起......我本来打算张贴此答案,雷克南的回答评论,但不具备所需的50个众议员还)。



Answer 2:

从的OpenGL®ES 2.0编程指南

如作为文字值而言到目前为止,OpenGL ES 2.0的着色语言规范规定,任何恒定传播假设。 这意味着相同的文字值(S)的多个实例进行多次计数。 除了使用文字值,相应的常量变量应该声明。 这避免了相同的字面值计数多次,这可能会导致顶点着色器编译失败,如果顶点统一的存储需求超过什么实现支持。

我找不到在实际规格与此相关的任何东西。 还没有具体到iOS的信息。

您还可以检查GLSL优化器 (他人和大量的)写来解决这个问题的工具。



文章来源: Declaring constants instead of literals in vertex shader. Standard practice, or needless rigor?