2012-04-28 78 views
0

我遇到了簡單的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; 
} 
+0

顏色數據的綁定必須使用'GL_ELEMENT_ARRAY_BUFFER',因爲它不是頂點數據。 – 2012-04-28 18:24:27

+0

@StefanHanke:'GL_ELEMENT_ARRAY_BUFFER'僅適用於索引,您爲什麼認爲它適用於顏色?我不相信這是正確的。 – Tim 2012-04-28 18:43:52

+0

@Tim:糟糕,誤讀了文檔。抱歉! – 2012-04-28 18:45:41

回答

0

哇..這一切,是因爲我已經質感的約束,它由於某種原因,極力把它,即使我有質感COORDS殘疾人,我希望我可以只是聽時我被告知禁用任何不再需要的狀態。謝謝你們!問題解決了!

+1

確切地說,只要禁用了紋理(使用'glDisable(GL_TEXTURE_2D)'),綁定紋理(通過'glBindTexture')就不會造成任何傷害。 – 2012-04-29 13:17:23

+0

你在那裏做的好點 – Ruuhkis 2012-04-30 17:08:50