我遇到了簡單的2D OpenGL遊戲問題。 它真的很奇怪,我得到的紋理可以正確顯示等,但是當我想用簡單的顏色變化來創建粒子效果時,出於某種原因,它會顯示緩衝區中的錯誤顏色。我使用的是Android的OpenGL ES 1.1,但它與使用VBO的任何版本的OpenGL都是一樣的。OpenGL 2D顏色出錯了
我初始化屏幕等,並顯示紅色三角形,但根據我的顏色緩衝區,它應該是白色的,怎麼了?
GL11 gl11 = (GL11) gl;
gl11.glLoadIdentity();
gl11.glClear(GL_COLOR_BUFFER_BIT);
GLU.gluLookAt(gl, 0f, 0f, -container.getCamera().getScale(), 0f, 0f, 0f, 0f, -1f, 0f);
gl11.glEnableClientState(GL10.GL_VERTEX_ARRAY);
gl11.glEnableClientState(GL10.GL_COLOR_ARRAY);
gl11.glTranslatef(container.getCamera().getX(), container.getCamera().getY(), 0.0f);
container.addParticle(new ColouredParticle(-container.getCamera().getX(), -container.getCamera().getY(), (float)Math.random(), (float)Math.random(), 0f, 5000));
particleColorBufferPointer = createFloatBuffer(gl11, GL11.GL_ARRAY_BUFFER, new float[] {
1f, 1f, 1f, 1f,
1f, 1f, 1f, 1f,
1f, 1f, 1f, 1f,
});
gl11.glBindBuffer(GL11.GL_ARRAY_BUFFER, particleColorBufferPointer);
gl11.glColorPointer(4, GL10.GL_FLOAT, 0, 0);
particleVertexBufferPointer = createFloatBuffer(gl11, GL11.GL_ARRAY_BUFFER, new float[]{
-0.1f, -0.05f,
0.1f, -0.05f,
0.0f, 0.05f
});
gl11.glBindBuffer(GL11.GL_ARRAY_BUFFER, particleVertexBufferPointer);
gl11.glVertexPointer(2, GL10.GL_FLOAT, 0, 0);
gl11.glDrawArrays(GL11.GL_TRIANGLES, 0, 3);
gl11.glDeleteBuffers(2, new int[]{particleVertexBufferPointer, particleColorBufferPointer}, 0);
gl11.glDisableClientState(GL10.GL_VERTEX_ARRAY);
gl11.glDisableClientState(GL10.GL_COLOR_ARRAY);
int error = gl11.glGetError();
if(error != GL11.GL_NO_ERROR) {
Log.v(TAG, "error " + Integer.toHexString(error));
}
它包含三角形頂點和顏色只是簡單的硬編碼float數組,但由於某些原因的顏色是錯誤的,因爲我之前說的,什麼都可能出差錯的代碼,這樣少量的?顏色不會更改爲黑色,而只會從緩衝區讀取紅色值。它也絕對沒有錯誤!
createFloatBuffer方法:
private int createFloatBuffer(GL11 gl, int type, float[] data) {
int[] bufferPointerBuffer = new int[1];
gl.glGenBuffers(1, bufferPointerBuffer, 0);
int bufferPointer = bufferPointerBuffer[0];
gl.glBindBuffer(type, bufferPointer);
FloatBuffer dataBuffer = createFloatBuffer(data);
gl.glBufferData(type, data.length * FLOAT_SIZE, dataBuffer, GL_STATIC_DRAW);
gl.glBindBuffer(type, -1);
return bufferPointer;
}
顏色數據的綁定必須使用'GL_ELEMENT_ARRAY_BUFFER',因爲它不是頂點數據。 – 2012-04-28 18:24:27
@StefanHanke:'GL_ELEMENT_ARRAY_BUFFER'僅適用於索引,您爲什麼認爲它適用於顏色?我不相信這是正確的。 – Tim 2012-04-28 18:43:52
@Tim:糟糕,誤讀了文檔。抱歉! – 2012-04-28 18:45:41