2012-12-21 60 views
3

我有一個有8個頂點的頂點數組,每個頂點由兩個座標表示。 我已經使用glVertexPointer函數使用這個數組在繪圖中使用glDrawArray函數。頂點數組沒有繪製

void datasource() 
{ 
    GLfloat vertex1[]={ -1.000000, 0.500000, -0.700000, 0.500000, -1.000000, 0.800000, -0.700000, 0.800000, -0.400000, 0.500000, -0.100000, 0.500000, -0.400000, 0.800000, -0.100000, 0.800000 }; 

    glEnableClientState(GL_VERTEX_ARRAY); 
    glVertexPointer(2, GL_FLOAT, 0, vertex1); 
} 

void display() 
{ 
    frame++; 

    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 

    glDrawArrays(GL_LINES, 0, 2); 

    glutSwapBuffers(); 
    glutPostRedisplay(); 
} 

當我嘗試使用前兩個頂點繪製線時,我沒有看到任何東西,但它應該出現水平線。我究竟做錯了什麼?

+0

'glVertexPointer'已被棄用,您應該使用'glVertexAttrib'來代替。 –

+1

@BartekBanachewicz:只有在OP使用OpenGL-3或更高版本的情況下。 – datenwolf

+0

@datenwolf使用這個邏輯,我們不能說*任何*被棄用,因爲OP可能會使用1.1 –

回答

0

你應該每次都使用glVertexPointer功能,當你調用display功能

+0

這對'vertex1'在'datasource'堆棧中並沒有幫助,只要'datasource'返回就會失效。 – datenwolf

4

我在做什麼錯?

你的數據是在一個函數的堆棧上,你可能調用了設置數組的指針。不幸的是,只要函數返回,棧幀就會被釋放,並且指針變得無效。

因此,先使用VBO將該數據複製到持久OpenGL對象。或者在堆上分配內存或者作爲全局變量。

你也應該相應glDraw…函數調用之前正確的判罰glEnableClientStateglVertexPointer

+0

非常感謝,當我將'vertex1'設置爲全局變量 – user1841718

+0

@ user1841718時,它可以工作,那麼接受有用的答案將是非常好的。 – Joulukuusi