来自The OpenGL® ES Shading Language (v1.00, r17) [PDF]的第5.8节(强调我的):
赋值运算符将rvalue-expression的值存储到l值中,并返回一个r值,其中包含lvalue-expression的类型和精度。 lvalue-expression和rvalue-expression必须具有相同的类型。必须通过构造函数明确指定所有需要的类型转换。
所以听起来像做这样的事情不是合法的:
vec3 my_vec3 = vec3(1, 2, 3);
vec4 my_vec4 = my_vec3;
为了使其合法,第二行必须是:
vec4 my_vec4 = vec4(my_vec3, 1); // add 4th component
我认为glVertexAttribPointer
有类似的要求。也就是说,如果您分配给vec4
size
参数必须等于4。
然后我遇到了GLES20TriangleRenderer sample for Android。一些相关的片段:
attribute vec4 aPosition;
maPositionHandle = GLES20.glGetAttribLocation(mProgram, "aPosition");
GLES20.glVertexAttribPointer(maPositionHandle, 3, GLES20.GL_FLOAT, false,
TRIANGLE_VERTICES_DATA_STRIDE_BYTES, mTriangleVertices);
所以aPosition
是vec4
,但用于设置它的glVertexAttribPointer
调用的size
为3.此代码是否正确,是{{1依赖于未指明的行为,还是我还缺少其他东西?
答案 0 :(得分:11)
传递给着色器的属性数据的大小不必与该着色器中的属性大小相匹配。您可以将2个值(从glVertexAttribPointer
)传递到定义为vec4
的属性;剩下的两个值为零,除了W组件为1.同样,您可以将4个值传递给vec2
属性;额外的值被丢弃。
因此,您可以根据需要将顶点属性与上传的值混合搭配。