【发布时间】:2011-10-12 23:00:35
【问题描述】:
来自The OpenGL® ES Shading Language (v1.00, r17) [PDF] 的第 5.8 节(强调我的):
赋值运算符将右值表达式的值存储到左值中,并返回具有左值表达式类型和精度的右值。 左值表达式和右值表达式必须具有相同的类型。所有需要的类型转换必须通过构造函数显式指定。
所以听起来像这样的事情不是合法的:
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。一些相关的sn-ps:
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 的调用有3 个size。此代码是否正确,GLES20TriangleRenderer 是否依赖于未指定的行为,或者是否存在我还缺少什么?
【问题讨论】:
标签: opengl-es glsl opengl-es-2.0