当前位置: 首页 > 知识库问答 >
问题:

Android opengl es 2.0顶点/索引缓冲区不工作

宣高朗
2023-03-14

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

以下是我使用的一些片段,去掉了不相关的部分

    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);

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

我花了一整天的时间试图改变一些小细节,并按不同的顺序打电话,但都没有用。

起初,我试图用以下数据呈现一个立方体:私有浮点[]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};

但是我决定使用这个测试数据,这在DrawArray中工作,而不使用指示符

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

共有1个答案

闻人浩波
2023-03-14

如果以后有人遇到这个问题,手性代码告诉我如何通过替换来解决我的问题

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

具有

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

还要为glDrawElements的相应参数使用标记计数。

 类似资料:
  • 我目前正在使用LWJGL / OpenGL创建一个2D,自上而下的游戏,但是在绘制实体之后,在使用顶点缓冲区对象渲染实体后,在让它们四处移动的过程中,我遇到了一些问题。这是渲染线程的 run() 方法,以及设置方法: 实体从抽象超类继承这些方法来设置 VBO 并绘制实体(呈现线程中的 drawEntities 方法仅调用该方法,实体更新方法(见下文),而 setUpEntities 调用 setU

  • 我正在尝试从ArrayList读取并创建VBO,然后对其进行渲染。问题是我只是渲染了一个空白屏幕。当我立即渲染时,一切都很好;只有现在VBO的才不起作用。 游戏循环如下所示,相机调用glTranslate和glRotate函数。 渲染方法: 阵列列表具有顶点和链接的颜色。每个体素将其顶点添加到ArrayList(而不是立即渲染)。

  • 我正在努力学习LWJGL (OpenGL)不得不说我很艰难。 我试着在窗户上画一个三角形和一个四边形,最后我设法做到了。 但我还有一个问题 如果您觉得这个问题很愚蠢,请提前表示歉意,但我在网上找不到非常详细的教程,所以很难理解,因为这是我第一次使用OpenGL。 话虽如此,这是代码的相关部分: 假设程序以60 fps的速度运行。< br >这意味着渲染方法每秒钟被游戏循环调用60次。 该渲染方法的

  • 下面的lwjgl3代码设置缓冲区等,用于呈现三角形。我能看到三角形。现在我正努力弄明白到底是怎么回事。 下面是我对代码的理解。我们首先创建一个顶点缓冲区对象,它只是一个数组的容器。glBindBuffer()和glBufferData()使用顶点数组填充顶点缓冲区对象。我们再次对第二个顶点数组执行此操作。然后我们编译顶点和片段着色器,并将它们添加到着色器程序中。不知怎么的,这个程序访问第二个顶点缓

  • 我正在努力理解这两个,如何使用它们,以及它们是如何联系的。假设我想创建一个简单的地形和一个有纹理的立方体。对于这两个对象,我有三角形、顶点的数组,对于立方体,我有一个包含纹理数据的数组。我的问题是:我如何使用VAOs和VBOs来创建和呈现这两个? null

  • null null null 在原始OpenGL中这样做虽然简单,但如果为单个缓冲区设置了许多属性,就会失去控制。我想我可以简化调用属性函数的过程,使用具有如下API的可变模板: 然而,这是不可行的,因为模板参数(AFAIK)实际上不是可变的,而是只能使参数可变。我不想使用函数参数的原因是,我希望能够输入C++关键字和,它们不能用作参数。我目前的解决方案是将参数与重复基本类型的枚举一起使用,例如和