【问题标题】:Can you use glVertexAttribPointer to assign a smaller vector to a larger one?您可以使用 glVertexAttribPointer 将较小的向量分配给较大的向量吗?
【发布时间】: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);

所以aPositionvec4,但用于设置它的glVertexAttribPointer 的调用有3 个size。此代码是否正确,GLES20TriangleRenderer 是否依赖于未指定的行为,或者是否存在我还缺少什么?

【问题讨论】:

    标签: opengl-es glsl opengl-es-2.0


    【解决方案1】:

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

    因此,您可以随心所欲地将顶点属性与上传的值混合和匹配。

    【讨论】:

    • 有趣。这种行为是否记录在某处?
    • @LaurenceGonsalves:它记录在 OpenGL ES 规范中。
    • 我希望有一些更具体的东西。 :-) 作为记录,这似乎记录在规范的第 2.8 节“顶点数组”中,标题为“传输数组元素”。
    猜你喜欢
    • 1970-01-01
    • 2018-08-23
    • 1970-01-01
    • 1970-01-01
    • 2019-05-13
    • 2019-05-20
    • 1970-01-01
    • 2016-09-14
    • 1970-01-01
    相关资源
    最近更新 更多