2013-02-09 113 views
0

我想切换到VBO,现在没有索引。但我得到的只是一个空白的屏幕。有人能指出为什么它是空白的吗?如果我注释掉特定于vbo的代码并用mFVertexBuffer替换glVertexAttribPointer中的0(偏移量),即不使用VBO,那么相同的代码工作正常。OpenGL ES 2.0 VBO问题

这是我的onDraw方法

GLES20.glClearColor(0.50f, 0.50f, 0.50f, 1.0f); 
GLES20.glClear(GLES20.GL_DEPTH_BUFFER_BIT | GLES20.GL_COLOR_BUFFER_BIT); 
// Bind default FBO 
// GLES20.glBindFramebuffer(GLES20.GL_FRAMEBUFFER, 0); 
GLES20.glUseProgram(mProgram); 
checkGlError("glUseProgram"); 



GLES20.glEnable(GLES20.GL_BLEND); 
GLES20.glBlendFunc(GLES20.GL_SRC_ALPHA, GLES20.GL_ONE_MINUS_SRC_ALPHA); 

GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, id); 
int vertexCount = mCarVerticesData.length/3; 

GLES20.glBindBuffer(GLES20.GL_ARRAY_BUFFER, buffers[0]); 
checkGlError("1"); 
GLES20.glVertexAttribPointer(positionHandle, 3, GLES20.GL_FLOAT,false, 0, 0); 
checkGlError("2"); 
GLES20.glEnableVertexAttribArray(positionHandle); 
checkGlError("3 "); 
transferTexturePoints(getTextureHandle()); 
GLES20.glDrawArrays(GLES20.GL_TRIANGLES, 0, vertexCount); 
checkGlError("glDrawArrays"); 
GLES20.glBindBuffer(GLES20.GL_ARRAY_BUFFER, 0); 
GLES20.glDisableVertexAttribArray(positionHandle); 
GLES20.glDisable(GLES20.GL_BLEND); 

这是我的VBO设置:

// Allocate and handle vertex buffer 
    ByteBuffer vbb2 = ByteBuffer.allocateDirect(mCarVerticesData.length 
      * FLOAT_SIZE_BYTES); 
    vbb2.order(ByteOrder.nativeOrder()); 
    mFVertexBuffer = vbb2.asFloatBuffer(); 
    mFVertexBuffer.put(mCarVerticesData); 
    mFVertexBuffer.position(0); 

    // Allocate and handle vertex buffer 

    this.buffers = new int[1]; 

    GLES20.glGenBuffers(1, buffers, 0); 
    GLES20.glBindBuffer(GLES20.GL_ARRAY_BUFFER, buffers[0]); 
    GLES20.glBufferData(GLES20.GL_ARRAY_BUFFER, mFVertexBuffer.capacity() 
      * FLOAT_SIZE_BYTES, mFVertexBuffer, GLES20.GL_STATIC_DRAW); 

链接我的程序之前:

GLES20.glBindAttribLocation(program, 0, "aPosition"); 
checkGlError("bindAttribLoc"); 

我的顶点着色器是:

uniform mat4 uMVPMatrix; 
attribute vec4 aPosition; 
attribute vec2 aTextureCoordinate; 
varying vec2 v_TextureCoordinate; 
void main() 
{ 
    gl_Position = uMVPMatrix * aPosition; 
    v_TextureCoordinate = aTextureCoordinate; 
    gl_PointSize= 10.0; 
} 

回答

0

我通过重写上传顶点数据的方式解决了这个问题。我正在修改它,所以我需要再次调用glBindBufferData才能上传它。而且我能够在不使用glDrawElements和索引的情况下使用VBOs,它运行良好。

0

您还需要生成一个元素数组,并调用这样的事情,以使您的“对象”:

// Bind the vertex buffer 
GLES20.glBindBuffer(GLES20.GL_ARRAY_BUFFER, _bufferIds.get(2)); 
GLES20.glVertexAttribPointer(4, 4, GLES20.GL_FLOAT, false, 4*4, 0); 
// Bind the elements buffer and draw it 
GLES20.glBindBuffer(GLES20.GL_ELEMENT_ARRAY_BUFFER, _bufferIds.get(1)); 
GLES20.glDrawElements(GLES20.GL_TRIANGLES, _numElements, GLES20.GL_UNSIGNED_SHORT, 0); 

希望有所帮助。

+0

感谢您的评论。但是,这不仅仅适用于带索引的glDrawElements吗? 编辑:我想绘制很多点,我可能会改变每一帧。在这样的设置中,指数是不必要的(如果我错了,请纠正我)!现在,我试图使用VBO来查看它如何与“流”输入行为。 – BatCoder 2013-02-12 08:21:27

+0

你是不正确的,你需要指示。指数是,opengl用来解决哪些点应该绘制(在你的情况很容易,只是一个从0开始到max_points-1结束的线性数组索引)。如果没有索引,屏幕上不会显示任何内容。 – Trax 2013-02-12 08:37:15

+0

我试过在我的代码中包含索引,但仍然无法使其正常工作。 getGLError返回0,所以没有错误。如果我尝试在没有VBO的情况下包含一些代码,它会很好地显示非VBO对象。 此外,谷歌搜索确实告诉我索引只需要索引渲染,我不需要,因为我没有多个共享顶点的对象。我的应用程序主要显示点精灵。 – BatCoder 2013-02-14 03:51:23