【问题标题】:Android opengl es 2.0 Vertex/Index Buffer not workingAndroid opengl es 2.0 顶点/索引缓冲区不起作用
【发布时间】:2013-07-20 00:15:55
【问题描述】:

我正在尝试通过 Android 3.2 上的 OpenGL ES 2.0 绘制一个形状。我可以使用 DrawArrays 和 FloatBuffer 按预期渲染场景,但不能通过 glGenBuffers 和 vbo/ibo。

这里是我使用的一些 sn-ps,去掉了不相关的部分

    GLES20.glGenBuffers(1, vbo, 0);
    GLES20.glGenBuffers(1, ibo, 0);

    GLES20.glBindBuffer(GLES20.GL_ARRAY_BUFFER, vbo[0]); 
    GLES20.glBufferData(GLES20.GL_ARRAY_BUFFER, this.vertexBuffer.capacity() * 4, vertexBuffer, GLES20.GL_STATIC_DRAW);
    GLES20.glBindBuffer(GLES20.GL_ARRAY_BUFFER, 0);

    GLES20.glBindBuffer(GLES20.GL_ELEMENT_ARRAY_BUFFER, ibo[0]);
    GLES20.glBufferData(GLES20.GL_ELEMENT_ARRAY_BUFFER, indexBuffer.capacity() * 2, indexBuffer, GLES20.GL_STATIC_DRAW);
    GLES20.glBindBuffer(GLES20.GL_ELEMENT_ARRAY_BUFFER, 0);

以上是我创建数组的代码。下面是我的渲染代码。

    GLES20.glBindBuffer(GLES20.GL_ARRAY_BUFFER, vbo[0]);
    GLES20.glEnableVertexAttribArray(positionHandle);
    GLES20.glVertexAttribPointer(positionHandle, 3, GLES20.GL_FLOAT, false, 3 * 4, vertexBuffer);
    GLES20.glBindBuffer(GLES20.GL_ELEMENT_ARRAY_BUFFER, ibo[0]);

    GLES20.glDrawElements(GLES20.GL_TRIANGLE_STRIP, 1, GLES20.GL_UNSIGNED_SHORT, 0);

    GLES20.glBindBuffer(GLES20.GL_ARRAY_BUFFER, 0);
    GLES20.glBindBuffer(GLES20.GL_ELEMENT_ARRAY_BUFFER, 0);

我知道我的顶点浮动缓冲区工作正常,因为如果我用下面的代码替换上面的代码,它会按预期工作:

    GLES20.glEnableVertexAttribArray(positionHandle);
    GLES20.glVertexAttribPointer(positionHandle, 3, GLES20.GL_FLOAT, false, 3 * 4, vertexBuffer);
    GLES20.glDrawArrays(GLES20.GL_TRIANGLE_STRIP, 0, 3);

当我调试 DrawArrays 是否可以工作时(如果我删除与绑定缓冲区有关的所有代码,它会工作),我发现我可以保留所有 gen/bind/data 缓冲区调用,除了 *GLES20.glBindBuffer( GLES20.GL_ARRAY_BUFFER, vbo[0]);*,这个会在使用drawArrays时专门阻止渲染

我花了一整天的时间尝试更改一些小细节并以不同的顺序调用,但无济于事。

起初我试图用以下数据渲染一个立方体: 私有浮点[] pts = { -1f, 1f, -1f,

                         1f,    1f,     -1f,
                         -1f,   1f,     1f,
                         1f,    1f,     1f,
                         -1f,   -1f,    -1f,
                         1f,    -1f,    -1f,
                         -1f,   -1f,    1f,
                         1f,    -1f,    1f };
private short indecies[] = {0,1,2,3,6,7,4,5,0,1,1,5,3,7,7,6,6,2,4,0};

但我决定使用这个测试数据,它可以在 drawArrays 中使用而不使用索引

    private float[] pts = {     -1,0,0,
                            1f,0,0,
                            0f,1,0};
private short[] indecies = {0,1,2};

【问题讨论】:

  • 在这一行 "GLES20.glVertexAttribPointer(positionHandle, 3, GLES20.GL_FLOAT, false, 3 * 4, vertexBuffer)" 最后两个参数应该是 0。在这一行 "GLES20.glDrawElements(GLES20 .GL_TRIANGLE_STRIP, 1, GLES20.GL_UNSIGNED_SHORT, 0);"将“1”替换为索引计数。
  • 谢谢,我已经尝试过你之前提到的第二件事,但第一个建议正是我所需要的!

标签: android opengl-es vbo vertex-buffer


【解决方案1】:

如果其他人以后遇到这个问题,Chiral Code 告诉我如何通过替换来解决我的问题

GLES20.glVertexAttribPointer(positionHandle, 3, GLES20.GL_FLOAT, false, 3 * 4, vertexBuffer);

GLES20.glVertexAttribPointer(positionHandle, 3, GLES20.GL_FLOAT, false, 3*4, 0);

还将索引计数用于 glDrawElements 的相应参数。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-02-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多