Opengl es GLSL(ES 3.0):使用另一种制服参照制服';s位置和偏移量

Opengl es GLSL(ES 3.0):使用另一种制服参照制服';s位置和偏移量,opengl-es,glsl,glsles,Opengl Es,Glsl,Glsles,在GLSL for OpenGL ES 3.0中,如果我有以下代码: uniform mat4 matrix1; uniform mat4 matrix2; uniform mat4 matrix3; 是否可以仅使用matrix1的位置加上偏移量来引用matrix2或matrix3?这必须是动态的,即索引将是一个属性 编辑:我的意思是在着色器本身中使用matrix2和matrix3,仅使用matrix1的位置和偏移量,而不获取它们在CPU上的位置 编辑2:如果有帮助,我将添加更多上下文。我正试

在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规范的要求相反)。我现在正在考虑逐个存储矩阵数组,但是仍然需要能够使用作为属性提供的索引来访问它们。

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

在编译时之前,它们不会“生成”(并且会因着色器优化而更改)

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

不,这是不可能的

统一位置仅在链接着色器之后指定,并且不要求按照着色器源中显示的顺序顺序指定它们。虽然这是我见过的唯一的行为,但这不是一个要求


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

至于通过除常量整数以外的任何方法对制服进行索引,此行为取决于着色器阶段,您已经知道了。在顶点着色器中,您可以使用所需的任何整数表达式对它们进行索引,而在片段着色器中,实现只需要支持常量索引(尽管许多实现都支持更多)。常量整数和常量索引表达式不是一回事,常量索引的限制性稍微小一些(在某些情况下可以包含循环控制变量)

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


您是否正确地为GLSL着色器添加了
#版本300 es
?上面描述的行为适用于GLSL ES 1.0,如果不告诉编译器其他情况,您将默认使用GLSL ES 1.0。如果您不使用
#version 300 es

我说的是使用matrix2/matrix3时,仅在着色器本身中使用matrix1的位置和偏移量,而不使用glGetUniformLocation with matrix1和偏移量在CPU上获取matrix2/matrix3的位置,那么兼容的实现将为您提供一组不同的限制。很抱歉给您带来任何困惑。感谢您提供了信息丰富的答案,我认为没有任何方法可以实现指针类型的行为,但值得一问!是的,我用正确的版本(300秒)作为着色器的前缀。您曾写道“不能保证支持矩阵中的动态索引元素”,我可能误读了规范,但我认为数组索引的内容适用于所有类型(包括矩阵)?无论哪种方式,你都是对的,在Adreno上使用统一的VEC4数组工作得很好,这是他们在SDK中所做的,所以我也这么做了:)@Rajveer:不,绝对不是这样。矩阵不是真正的数组,您可以像数组一样对它们进行索引,以访问矩阵中的各个列,但它们不是数组。同样的方法,如果你有
vec3 foo
,你可以写
foo[0]
,意思是
foo.x
(即使
vec3
float[3]
不是一回事),但是如果你有类似
inti=0
的东西并试图使用
foo[i]
意思是
foo.x
实现不需要支持这一点。啊,对不起,我误读了你写的内容。我以为你说的是矩阵数组,而不是把单个矩阵当作向量数组。在这种情况下,动态索引一个统一的矩阵数组应该像动态索引一个统一的向量数组一样工作(当然是在顶点着色器中)。@Rajveer:是的,应该这样。如果您有一个统一的
mat4
数组,而不是使用几个不同名称的
mat4
制服,那么它实际上满足您想要的属性之一。每个
mat4
分配4个顺序统一位置(每列1个),数组中的每个
mat4
也按顺序分布。因此,如果您这样做,则可以通过基本统一位置+偏移量来保证您能够引用特定的
mat4
。要在统一数组中获得第n个
mat4
,它将是
base_loc+(4*(n-1))
。尽管您说过您的实现不喜欢这样:-\