2011-06-16 369 views
3

我一直在嘗試使用Android的OpenGL的點雲

gl.glDrawElements(GL10.GL_POINTS, 4, GL10.GL_UNSIGNED_BYTE, vertexBuffer); 

我的屏幕採用了頂點緩衝區上繪製得4分,但我不能得到它的工作。我想畫的是點,因爲最終我想做點雲顯示。如果我有大量的點(最終),是頂點緩衝區的路要走嗎?他們不會改變,但我會想改變他們的觀點和角度。

vertexBuffer設置:

private float vertices[] = { 
    -3.0f, 1.0f, -2.0f, // 0, Top Left 
    -3.0f, -1.0f, 0.0f, // 1, Bottom Left 
    -2.0f, -1.0f, -2.0f, // 2, Bottom Right 
    -2.0f, 1.0f, 0.0f, // 3, Top Right 
    }; 


// Our vertex buffer. 
private FloatBuffer vertexBuffer; 
ByteBuffer vbb = ByteBuffer.allocateDirect(vertices.length * 4); 
vbb.order(ByteOrder.nativeOrder()); 
vertexBuffer = vbb.asFloatBuffer(); 
vertexBuffer.put(vertices); 
vertexBuffer.position(0); 

這是我的電流消耗呼籲我的觀點(我不想因爲指數的形狀繪製順序並不重要,我):

public void draw(GL10 gl) { 
    // Enabled the vertices buffer for writing and to be used during 
    // rendering. 
    gl.glEnableClientState(GL10.GL_VERTEX_ARRAY); 

    gl.glPointSize(3); 

    // Specifies the location and data format of an array of vertex 
    // coordinates to use when rendering. 
    gl.glVertexPointer(3, GL10.GL_FLOAT, 0, vertexBuffer); 

    gl.glDrawElements(GL10.GL_POINTS, 4, 
      GL10.GL_UNSIGNED_BYTE, vertexBuffer); 

    // Disable the vertices buffer. 
    gl.glDisableClientState(GL10.GL_VERTEX_ARRAY); 
    // Disable face culling. 
    gl.glDisable(GL10.GL_CULL_FACE); 
} 

的當我調用draw()時,程序當前崩潰;

謝謝!

回答

5

你完全錯誤地使用了glDrawElements。這個函數想要一個包含索引的索引數組到頂點數組而不是頂點數據本身(這就是glVertexPointer的用途)。要麼使用

private unsigned byte indices[] = { 0, 1, 2, 3 }; 
... 
gl.glDrawElements(GL10.GL_POINTS, 4, GL10.GL_UNSIGNED_BYTE, indices); 

但在你的情況,你只呈現的所有點,不需要任何指標,所以你可以叫

gl.glDrawArrays(GL10.GL_POINTS, 0, 4); 

,而不是glDrawElements

編輯:它崩潰的具體原因是,glDrawElements解釋所提供vertexBuffer爲4個字節的陣列,並且這些字節參考頂點你的頂點數據(0〜3)的範圍內的。

+0

謝謝基督徒,你說的話確實有道理。 但是,它仍然崩潰。經過很多研究,我找不出原因。我在這裏拋出了一個小的java文件,如果你可以爲我掃描它:http://www.qfpost.com/download.do?get=02700a1c0975664801e60c1cccfd6d02 – RedLeader 2011-06-16 17:35:29

+0

@RedLeader你不必繪製'vertices.length'( 12)個頂點,但只有4個,因爲每個頂點都由3個浮點數組成(如在你的'glVertexPointer'調用中指定的那樣)。因此,無論是使用'vertices.length/3'還是隻使用'4'作爲'glDrawArrays'的第三個參數。 – 2011-06-16 17:40:53

+0

瞭解。儘管兩種方式都導致空指針異常。我直接調用draw(gl)函數,並在調用的某個時刻失敗。 – RedLeader 2011-06-16 17:42:48