2013-01-08 70 views
0

我寫一些openGL的包裝,我試圖運行下面的代碼:調用glDrawElements glInterleavedArrays不工作

void some_func1() { 
    float vertices[] = {50.0, 50.0, 0.0, 20.0, 50.0, 0.0, 20.0, 60.0, 0.0}; 
    glColor3f(1.0, 0.0, 0.0); 
    glInterleavedArrays(GL_V3F, 0, vertices); 
} 

void some_func2() { 
    int indices[] = {0,1,2}; 
    glDrawElements(GL_TRIANGLES, 3, GL_UNSIGNED_INT, indices); 
} 

void parent_func() { 
    some_func1(); 
    some_func2(); 
} 

但它似乎是OpenGL是不在第二拿起電話給glDrawElements功能。我的例程打開一個窗口,將其清除爲黑色,並且不繪製任何內容。奇怪的是,運行此代碼

void some_func1() { 
    float vertices[] = {50.0, 50.0, 0.0, 20.0, 50.0, 0.0, 20.0, 60.0, 0.0}; 
    int indices[] = {0,1,2}; 
    glColor3f(1.0, 0.0, 0.0); 
    glInterleavedArrays(GL_V3F, 0, vertices); 
    glDrawElements(GL_TRIANGLES, 3, GL_UNSIGNED_INT, indices); 
} 

void parent_func() { 
    some_func1(); 
} 

完全按預期工作:繪製一個紅色三角形。我查看了文檔,並搜索了一遍,但我找不到任何glDrawElements不起作用的原因,或者如果在另一個函數中調用,會以某種方式錯過數據。有任何想法嗎?

僅供參考:我通過VirtualBox,主機上的32位處理器在Ubuntu 12.04 VM上運行此操作,並且freeglut正在處理我的窗口。我還設置了LIBGL_ALWAYS_INDIRECT = 1來解決VM的3D渲染問題。 (不確定是否有任何問題,但是... :))

回答

1

原因是,在使用glDrawElements進行繪製時,沒有有效的頂點數據要繪製。當調用glInterleavedArrays(它只是在底層調用一堆gl...Pointer調用)時,你只是告訴OpenGL在哪裏找到頂點數據,而不需要複製任何東西。在繪製操作之前不會訪問實際數據(glDrawElements)。因此,在some_func1中,您正在設置一個指向局部變量vertices的指針,該函數在函數返回後不再存在。這不會發生在您修改後的代碼中(指針設置和繪製在相同的函數中)。

因此,要麼讓這個陣列在glDrawElements調用之前存活,要麼通過使用vertex buffer object並執行實際的數據複製,甚至更好地使OpenGL實際存儲頂點數據本身。在這種情況下,您可能還想避免使用已過時的glInterleavedArrays函數(無論如何,它僅僅是圍繞正確的gl...PointerglEnableClientState調用進行的軟件封裝)。

+0

啊哈,這是我的理解,'glnterleavedArrays'實際上確實存儲在緩衝區中的數組。這非常合理。謝謝! – trlemburg

+0

@trlemburg但最終如何呢。你不告訴它任何大小,它應該怎麼知道要複製什麼? –