典型的OpenGL實現將排隊大量的調用,以將它們一起批量處理成活動突發,以便優化使用可用的通信帶寬和GPU時間資源。
你想要做的事情基本上與雙緩衝渲染相反,即渲染每個繪圖步驟立即可見的地方。一種方法是通過渲染到單個緩衝窗口並在每個步驟後調用glFinish()
。主要缺點:在使用合成窗口管理器和類似工具的現代系統上很可能無法正常工作。
我推薦的另一種方法是使用單獨的緩衝區進行增量繪製,並不斷刷新主幀緩衝區。關鍵主題是幀緩衝區對象和渲染到紋理。
首先你創建一個FBO(大量的教程,並作爲StackOverflow的答案)。 FBO基本上是一種抽象,您可以將目標緩衝區(如紋理或渲染緩衝區)連接到該抽象層,並將其綁定爲繪圖調用的目標。
那麼如何解決你的問題呢?首先,您不應該通過延遲繪圖循環來執行動畫。這有幾個原因,但主要的問題是,你鬆散的程序交互性。相反,您需要維護一個(全局)計數器,以指明您的動畫中的哪一步。讓我們把它叫做step
:
int step = 0;
然後在你的繪圖功能,你必須階段:1)紋理更新2)屏幕刷新
第一階段由結合您的幀緩衝區對象爲渲染目標。對於這項工作的目標質地必須是未綁定
glBindTexture(GL_TEXTURE_2D, 0);
glBindFramebuffer(GL_FRAMEBUFFER, animFBO);
glViewport(0, 0, fbo.width, fbo.height);
set_animFBO_projection();
的伎倆,現在是,你清除animFBO只有一次,創建後即,然後永遠不再。現在,根據動畫一步
draw_lines_for_step(step);
畫你的線條,並增加步驟計數器(能做到這一點作爲一個複合語句,但是這是更清楚了)
step++;
更新動畫FBO它的後有時間更新屏幕。首先取消綁定animFBO
glBindFramebuffer(GL_FRAMEBUFFER, 0);
我們現在主,屏幕上的幀緩衝
glViewport(0, 0, window.width, window.height);
set_window_projection(); //most likely a glMatrixMode(GL_PROJECTION); glOrtho(0, 1, 0, 1, -1, 1);
現在綁定FBO附加質地和失敗中汲取到全視四
glBindTexture(GL_TEXTURE_2D, animFBOTexture);
draw_full_viewport_textured_quad();
最後做緩衝區交換顯示動畫步驟迭代
SwapBuffers();
交換緩衝區調用很可能會損壞後臺緩衝區的內容,因此繪製延續將不起作用。 – datenwolf
SwapBuffer沒有工作,我不知道這是因爲座標文件太大還是其他原因。該程序進入永遠運行的心情,屏幕上沒有任何顯示......但thx無論如何! – Solorchid