0

在 GLSL for OpenGL ES 3.0 中,如果我有以下代码:

uniform mat4 matrix1;
uniform mat4 matrix2;
uniform mat4 matrix3;

是否可以仅使用 matrix1 的位置加上偏移量来引用 matrix2 或 matrix3?这必须是动态的,即索引将是一个属性。

编辑:我的意思是在着色器本身中使用 matrix2 和 matrix3,只有 matrix1 的位置和一个偏移量,而不是在 CPU 上获取它们的位置。

编辑2:如果有帮助,我会添加更多上下文。我正在尝试解决这个GPU 蒙皮问题,我注意到 Adreno 不支持在其顶点着色器中使用除常量整数以外的任何内容来索引统一数组(与 OpenGL ES 3.0 GLSL 规范的要求相反)。我现在正在考虑一个接一个地单独存储矩阵数组,但是仍然需要能够使用作为属性提供的索引来访问它们。

4

2 回答 2

1

我的意思是在着色器本身中使用 matrix2 和 matrix3,只有 matrix1 的位置和一个偏移量,而不是在 CPU 上获取它们的位置。

不,这是做不到的。

统一位置仅在链接着色器后分配,并且不要求按照它们出现在着色器源中的相同顺序依次分配它们。虽然这是我见过的唯一行为,但这不是必需的。


Adreno 不支持在其顶点着色器中使用除常量整数以外的任何内容来索引统一数组(与 OpenGL ES 3.0 GLSL 规范的要求相反)。

至于用常量整数以外的任何东西来索引制服,这种行为取决于着色器阶段,你已经知道了。在顶点着色器中,您可以使用所需的任何整数表达式对它们进行索引,在片段着色器中,实现只需要支持常量索引(尽管许多支持不止于此)。常量整数和常量索引表达式不是一回事,常量索引的限制较少(在某些情况下可以包括循环控制变量)。

也就是说,不能保证支持矩阵内的动态索引元素......(例如 vec4 column = matrix1 [some_variable];)。一些实现将支持这一点,而另一些则不会。

您是否正确地为您的 GLSL 着色器添加前缀#version 300 es?上述行为适用于 GLSL ES 1.0,如果您不告知编译器,您将默认使用该行为。如果您不使用#version 300 es.

于 2013-12-10T21:21:44.070 回答
0

必须使用 glGetUniformLocation 从 OpenGL 读取统一变量。

它们直到编译时才“生成”(并且可能由于着色器优化而改变)

于 2013-12-06T13:58:03.290 回答