我想切換到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;
}
感謝您的評論。但是,這不僅僅適用於帶索引的glDrawElements嗎? 編輯:我想繪製很多點,我可能會改變每一幀。在這樣的設置中,指數是不必要的(如果我錯了,請糾正我)!現在,我試圖使用VBO來查看它如何與「流」輸入行爲。 – BatCoder 2013-02-12 08:21:27
你是不正確的,你需要指示。指數是,opengl用來解決哪些點應該繪製(在你的情況很容易,只是一個從0開始到max_points-1結束的線性數組索引)。如果沒有索引,屏幕上不會顯示任何內容。 – Trax 2013-02-12 08:37:15
我試過在我的代碼中包含索引,但仍然無法使其正常工作。 getGLError返回0,所以沒有錯誤。如果我嘗試在沒有VBO的情況下包含一些代碼,它會很好地顯示非VBO對象。 此外,谷歌搜索確實告訴我索引只需要索引渲染,我不需要,因爲我沒有多個共享頂點的對象。我的應用程序主要顯示點精靈。 – BatCoder 2013-02-14 03:51:23