你可以使用glVertexAttribPointer将较小的向量分配给较大的向量吗?

Lau*_*ves 5 opengl-es glsl opengl-es-2.0

OpenGL®ES着色语言的第5.8节(v1.00,r17)[PDF](强调我的):

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

所以听起来像做这样的事情是合法的:

vec3 my_vec3 = vec3(1, 2, 3);
vec4 my_vec4 = my_vec3;
Run Code Online (Sandbox Code Playgroud)

为了使其合法,第二行必须是这样的:

vec4 my_vec4 = vec4(my_vec3, 1); // add 4th component
Run Code Online (Sandbox Code Playgroud)

我认为glVertexAttribPointer有类似的要求.也就是说,如果你指定的vec4size参数必须等于4.

然后我遇到了AndroidGLES20TriangleRenderer示例.一些相关的片段:

attribute vec4 aPosition;

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

GLES20.glVertexAttribPointer(maPositionHandle, 3, GLES20.GL_FLOAT, false,
        TRIANGLE_VERTICES_DATA_STRIDE_BYTES, mTriangleVertices);
Run Code Online (Sandbox Code Playgroud)

所以aPosition是一个vec4,但glVertexAttribPointer用于设置它的调用有一个size3.这个代码是否正确,是GLES20TriangleRenderer依赖于未指定的行为,还是有其他我缺少的东西?

Nic*_*las 11

传递给着色器的属性数据的大小不必与该着色器中的属性大小相匹配.您可以将2个值(from glVertexAttribPointer)传递给定义为a的属性vec4; 剩下的两个值为零,除了W分量为1.同样,你可以将4个值传递给一个vec2属性; 额外的值被丢弃.

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

  • 我希望有一些更具体的东西.:-)为了记录,这似乎记录在规范的第2.8节"顶点阵列"中,标题为"传输阵列元素". (7认同)