从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有类似的要求.也就是说,如果你指定的vec4是size参数必须等于4.
然后我遇到了Android的GLES20TriangleRenderer示例.一些相关的片段:
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依赖于未指定的行为,还是有其他我缺少的东西?