2011-11-21 22 views
1

在我的OpenGL問題集中,我繪製了一個特定的多邊形和鼠標選擇,我想從我選擇的地方繪製一個正方形。隨着鼠標移動的改變,繪製的正方形得到快速更新,最後應該粘貼到釋放鼠標按鈕的終點。OpenGL共面曲面

在我的鼠標動作例程中,我試着做glClear(GL_COLOR_BUFFER_BIT);並調用我寫的一個drawSquare函數。 glClear確保我只有一個獨特的方形繪製,而不是出現以前的圖像斑點。但是,這個清除也清除了我繪製的初始多邊形。

請諮詢如何確保我在現有的多邊形上有這個新的方形(從鼠標)。

P.S:我試圖在後緩衝器和正面的正方形上繪製底層多邊形,但glutSwapBuffers()創建了一個混亂。

+2

歡迎來到StackOverflow,我希望你閱讀[FAQ](http://stackoverflow.com/faq#howtoask)。 –

回答

4

像許多其他人一樣,您似乎錯誤地將OpenGL視爲場景管理API,這顯然是錯誤的。 OpenGL除了在屏幕上繪製東西外別無其他。繪製之後OpenGL完全忘記了多邊形。所以這意味着,你必須畫出每一幀你想要顯示的每一幀(通常在清除幀緩衝區之後)。

所以清除framebuffer,繪製你的多邊形,並繪製你的廣場。一旦方形位置(或其他)發生變化,再次清除幀緩衝區,繪製多邊形並繪製您的正方形。這是它的工作方式。

此外,您當然也不應該在鼠標例程中繪製任何東西,請撥打glClear,這會導致您遇到的那種垃圾。相反,更新您的場景,並要求窗口重繪自身,進而抽取所顯示方法整個場景:

mouseFunc() 
{ 
    updateSquare(); 
    glutPostRedisplay(); 
} 


displayFunc() 
{ 
    glClear(...); 
    drawPolygon(); 
    drawSquare(); 
    glutSwapBuffers(); 
} 

當然,以一切手段使用雙緩衝時不畫到前臺緩衝區。

+0

非常感謝您的回覆。我想澄清的是,我繪製的初始多邊形來自對巨大矩陣的詳盡數學分析,因此繪製第一個多邊形需要相當長的時間。 所以,使用glutPostRedisplay()似乎延遲了幾秒鐘的繪圖。 – Prando

+1

@ user1058100在這種情況下,您的設計是錯誤的。不要將多邊形的複雜計算與其繪圖交錯。只需使用詳盡的數學分析計算其頂點,然後在每次需要繪製時將這些頂點繪製爲多邊形。同樣,不要誤用OpenGL來管理你的場景,否則這些就是你將面臨的問題。 –

+0

謝謝你的見解。我會再次爲我的設計工作。 我還有一個問題, 在drawPolygon()和drawSquare()的順序中,glutFlush()如何影響場景而不是glutSwapBuffers。我仍然不明白OpenGL如何處理共面曲面。 感謝您的耐心等待 – Prando