2013-02-09 214 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