Android OpenGL ES 2. 0 VBO 不渲染

Posted

技术标签:

【中文标题】Android OpenGL ES 2. 0 VBO 不渲染【英文标题】:Android OpenGL ES 2. 0 VBO Not Rendering 【发布时间】:2016-05-15 13:33:16 【问题描述】:

我正在尝试获取一个简单的带纹理的四边形来渲染为 VBO。当不使用 VBO 时,一切都按预期工作(但是,对于静态对象,我仍然在每帧更新我的顶点数据,这似乎毫无意义,因此切换到 VBO)。

但是,我一定做错了什么,因为我什么也没得到,绝对是 zilch,渲染到屏幕上。

这是我的相关代码:

构造函数:

public VBO() 

        updateVertexData();

        vertexBuf = ByteBuffer.allocateDirect(vertices.length * 4).order(ByteOrder.nativeOrder()).asFloatBuffer();

        vertexBuf.put(vertices);

        vertexBuf.position(0);

        //Create buffers array for VBO (I'm using interleaved data so only 1 needed here??
        final int buffers[] = new int[1];

        GLES20.glGenBuffers(1, buffers, 0);

        GLES20.glBindBuffer(GLES20.GL_ARRAY_BUFFER, buffers[0]);

        GLES20.glBufferData(GLES20.GL_ARRAY_BUFFER, vertexBuf.capacity() * 4, vertexBuf, GLES20.GL_STATIC_DRAW);

        GLES20.glBindBuffer(GLES20.GL_ARRAY_BUFFER, 0);

        mBufferIdx = buffers[0];

        vertexBuf.limit(0);
        vertexBuf = null;
    

顶点更新

public void updateVertexData()

    vertices[0]=-1;
    vertices[1]=1f;
    vertices[2]=0;
    vertices[3]=0;
    vertices[4]=0;

    vertices[5]=1;
    vertices[6]=1f;
    vertices[7]=0;
    vertices[8]=1;
    vertices[9]=0;

    vertices[10]=-1;
    vertices[11]=-1f;
    vertices[12]=0;
    vertices[13]=0;
    vertices[14]=1;

    vertices[15]=1;
    vertices[16]=-1f;
    vertices[17]=0;
    vertices[18]=1;
    vertices[19]=1;

渲染

public void drawVBO()

    GLES20.glUseProgram(iProgId);

    mMVPMatrixHandle = GLES20.glGetUniformLocation(iProgId, "uMVPMatrix");

    GLES20.glUniformMatrix4fv(mMVPMatrixHandle, 1, false, mvpMatrix, 0);

    GLES20.glBindBuffer(GLES20.GL_ARRAY_BUFFER, mBufferIdx);

    GLES20.glEnableVertexAttribArray(iPosition);

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

    GLES20.glBindBuffer(GLES20.GL_ARRAY_BUFFER, mBufferIdx);

    GLES20.glEnableVertexAttribArray(iTexCoords);

    GLES20.glVertexAttribPointer(iTexCoords, 2, GLES20.GL_FLOAT, false, 5 * 4, 3);

    GLES20.glBindBuffer(GLES20.GL_ARRAY_BUFFER, 0);

    GLES20.glDrawArrays(GLES20.GL_TRIANGLE_STRIP, 0, 4);

   

就像我说的,如果我去掉 VBO 代码并将代码从 updateVertexData 移回我的 draw 方法,那么一切正常。如果有人能解释我在这里做错了什么,将不胜感激......

【问题讨论】:

嗨@RetoKoradi,感谢您的评论,我刚刚尝试过没有* 4,但没有任何区别,我仍然没有得到任何渲染。但是,不是 vertexBuf 是 Fl​​oatBuffer 而不是 ByteBuffer,因为我在末尾附加了一个“asFloatBuffer”?谢谢。 哦,好吧,我错过了这条线超出了可见区域,我不得不水平滚动。 没有问题@RetoKoradi,我想我已经弄清楚为什么它不起作用了:-) 【参考方案1】:

问题出在第二个“glVertexAttribPointer”行上的偏移量。

原行

GLES20.glVertexAttribPointer(iTexCoords, 2, GLES20.GL_FLOAT, false, 5 * 4, 3);

“偏移”参数(末尾的“3”)错误。 3 是位置数据(x、y 和 z)的大小,需要乘以 4(每个浮点数的字节数)。所以...

正确代码

//For readability
final int POSITION_SIZE = 3;
final int BYTES_PER_FLOAT = 4;
final int TEXTURE_SIZE = 2;
final int STRIDE = (POSITION_SIZE+TEXTURE_SIZE)*BYTES_PER_FLOAT   

//Correct line
GLES20.glVertexAttribPointer(iTexCoords, 2, GLES20.GL_FLOAT, false, STRIDE, (POSITION_SIZE*BYTES_PER_FLOAT));

【讨论】:

以上是关于Android OpenGL ES 2. 0 VBO 不渲染的主要内容,如果未能解决你的问题,请参考以下文章

android openGL ES2 一切从绘制纹理開始

Android OpenGL ES 2. 0 VBO 不渲染

Android OpenGL ES 2.0 模拟器

使用OpenGL ES 2.0在Android上创建Audio wave

Android:了解 OnDrawFrame、FPS 和 VSync (OpenGL ES 2.0)

Android Gameloop (openGL ES 2.0) 的问题