2013-12-13 64 views
-1

我正在研究什麼最終會成爲地形抽屜,但目前我只是試圖獲得一對基本的三角形來繪製glDrawElements。代碼如下這樣:glDrawElements未能繪製

公共類TerrainFlat擴展AbstractTerrain {

IntBuffer ib = BufferUtils.createIntBuffer(3); 

int vHandle = ib.get(0); 
int cHandle = ib.get(1); 
int iHandle = ib.get(2); 

FloatBuffer vBuffer = BufferUtils.createFloatBuffer(19); 
FloatBuffer cBuffer = BufferUtils.createFloatBuffer(18); 
ShortBuffer iBuffer = BufferUtils.createShortBuffer(6); 


@Override 
public void initilize(){ 


    float[] vertexData = {50, 20, 100,  50, -20, 100,  10, -20, 100,    -10, -20, 100,  -50, -20, 100,  -50, 20, 100}; 
    float[] colorData = {1, 0, 0, 0, 1, 0, 0, 0, 1, 0 , 0 , 1 , 0 , 1 , 0 , 1 , 0 , 0 }; 
    short[] indexData = {0,1,2,3,4,5}; 

    vBuffer.put(vertexData); 
    vBuffer.flip(); 


    cBuffer.put(colorData); 
    cBuffer.flip(); 


    iBuffer.put(indexData); 
    iBuffer.flip(); 

    glEnableClientState(GL_VERTEX_ARRAY); 
    glEnableClientState(GL_COLOR_ARRAY); 

    glBindBufferARB(GL_ELEMENT_ARRAY_BUFFER_ARB, iHandle); 
    glBufferDataARB(GL_ELEMENT_ARRAY_BUFFER_ARB, iBuffer, GL_STATIC_DRAW_ARB); 
    glBindBufferARB(GL_ELEMENT_ARRAY_BUFFER_ARB, 0); 

    glBindBufferARB(GL_ARRAY_BUFFER_ARB, vHandle); 
    glBufferDataARB(GL_ARRAY_BUFFER_ARB, vBuffer, GL_STATIC_DRAW_ARB); 
    glBindBufferARB(GL_ARRAY_BUFFER_ARB, 0); 


    glBindBufferARB(GL_ARRAY_BUFFER_ARB, cHandle); 
    glBufferDataARB(GL_ARRAY_BUFFER_ARB, cBuffer, GL_STATIC_DRAW_ARB); 
    glBindBufferARB(GL_ARRAY_BUFFER_ARB, 0); 






} 

@Override 
public void setUp(float posX, float posY, float posZ){ 



} 

@Override 
public void draw(){ 

        glClear(GL_COLOR_BUFFER_BIT); 

    glGenBuffersARB(ib); 
    vHandle = ib.get(0); 
    cHandle = ib.get(1); 
    iHandle = ib.get(2); 

    glEnableClientState(GL_VERTEX_ARRAY); 
    glEnableClientState(GL_COLOR_ARRAY); 

    glBindBufferARB(GL_ARRAY_BUFFER_ARB, vHandle); 
    glVertexPointer(3, GL_FLOAT, 3 << 2 , 0L); 
    glBindBufferARB(GL_ARRAY_BUFFER_ARB, 0); 

    glBindBufferARB(GL_ARRAY_BUFFER_ARB, cHandle); 
    glColorPointer(3, GL_FLOAT, 3 << 2 , 0L); 
    glBindBufferARB(GL_ARRAY_BUFFER_ARB, 0); 

    glBindBufferARB(GL_ELEMENT_ARRAY_BUFFER_ARB, iHandle); 

    glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_SHORT, 0L); 

    glBindBufferARB(GL_ARRAY_BUFFER_ARB, 0); 
    glBindBufferARB(GL_ELEMENT_ARRAY_BUFFER_ARB, 0); 


} 

@Override 
public void destroy(){ 
    ib.put(0, vHandle); 
    ib.put(1, cHandle); 
    ib.put(2, iHandle); 
    glDeleteBuffersARB(ib); 
} 



} 

這不畫任何東西,屏幕爲全黑。 GL_CULL_FACE未啓用,並且沒有照明(或缺少)導致此錯誤。將數據綁定移動到Draw()函數可以使其工作(如果您希望我可以將此代碼添加到此)。然而,這意味着我創建我的緩衝區的每個繪圖功能(即:壞)。我很想知道我在這裏做錯了什麼,因爲我已經移動了它,並將它愚蠢地打了4天。

+0

我敢肯定你不應該產生新的維也納組織每次繪製時間。如果您希望他們使用您在'initialize(...)'中生成的數據,請不要使用它。我會認真考慮將調用移動到'glGenBuffersARB(...)'到'initialize(...)'中。那就是說,你爲什麼使用ARB擴展來存儲緩衝區對象?自從OpenGL 1.5以來它們一直是核心。 –

+0

我已經解決了,一旦8小時過去了,我會發布解決方案。 – Peter

+0

在這兩種情況下,您的緩衝區數據跨度應爲零。 –

回答

1

你設置vHandle,cHandle和iHandle 0

你永遠需要在1號線創建IntBuffer反正。更換

int vHandle = ib.get(0); 
int cHandle = ib.get(1); 
int iHandle = ib.get(2); 

int vHandle = glGenBuffers(); 
int cHandle = glGenBuffers(); 
int iHandle = glGenBuffers(); 
+0

這不會解決問題,因爲每次調用「draw(...)」時,OP仍然會生成新的緩衝區。最終,GL實現將會耗盡名稱,而不是空的緩衝區的名字首先會帶來很多好處。部分解決方案是將非空白行2-5從'draw(...)'移動到'initialize(...)'。 –

相關問題