Opengl es 您可以使用GLVERTEXAttributePointer将较小的向量指定给较大的向量吗?

Opengl es 您可以使用GLVERTEXAttributePointer将较小的向量指定给较大的向量吗?,opengl-es,glsl,opengl-es-2.0,Opengl Es,Glsl,Opengl Es 2.0,根据第5.8节(重点矿山): 赋值运算符将右值表达式的值存储到l值中,并返回具有左值表达式类型和精度的r值左值表达式和右值表达式必须具有相同的类型。所有需要的类型转换必须通过构造函数显式指定。 所以听起来这样做是不合法的: vec3 my_vec3 = vec3(1, 2, 3); vec4 my_vec4 = my_vec3; 要使其合法化,第二行必须是: vec4 my_vec4 = vec4(my_vec3, 1); // add 4th component 我认为他们也有类似的要求。

根据第5.8节(重点矿山):

赋值运算符将右值表达式的值存储到l值中,并返回具有左值表达式类型和精度的r值左值表达式和右值表达式必须具有相同的类型。所有需要的类型转换必须通过构造函数显式指定。

所以听起来这样做是不合法的:

vec3 my_vec3 = vec3(1, 2, 3);
vec4 my_vec4 = my_vec3;
要使其合法化,第二行必须是:

vec4 my_vec4 = vec4(my_vec3, 1); // add 4th component
我认为他们也有类似的要求。也就是说,如果将
vec4
指定给
size
参数,则该参数必须等于4

然后,我遇到了一个问题。一些相关片段:

attribute vec4 aPosition;

maPositionHandle = GLES20.glGetAttribLocation(mProgram, "aPosition");

GLES20.glVertexAttribPointer(maPositionHandle, 3, GLES20.GL_FLOAT, false,
        TRIANGLE_VERTICES_DATA_STRIDE_BYTES, mTriangleVertices);

因此
aPosition
是一个
vec4
,但是用于设置它的
glvertexattributepointer
调用的
大小为3。此代码正确吗?
GLES20TriangleRenderer
依赖于未指定的行为,还是缺少其他内容?

传递到着色器的属性数据的大小不必与该着色器中属性的大小匹配。您可以将两个值(从
glvertexattributepointer
)传递给定义为
vec4
的属性;剩余的两个值为零,除了W分量为1。同样,您可以将4个值传递给
vec2
属性;多余的值将被丢弃


因此,您可以根据需要将顶点属性与上载的值混合匹配。

有趣。这种行为在什么地方有记录吗?@LaurenceGonsalves:它在OpenGL ES规范中有记录。我希望有更具体的东西。:-)为了记录在案,本规范第2.8节“顶点阵列”在标题“传输阵列元素”下对此进行了记录。