opengl雜七雜八

在用opengl寶典學習第二個例子,即畫一個矩形的時候我想偷懶一下,於是根本就沒寫ChangeSize函數,也沒有用glutReshapeFunc()調用,而是直接進行glRectf()調用,但是無論如何也並不顯示出矩形來。於是我有按照書上的敲了一編,這次就出現了。很迷茫。不是隻要窗口不改變大小就不用調用glutReshapeFunc()嗎,那麼有沒有應該沒有關係啊,即使是在glutReshapeFunc()中進行了座標系統的設置,那麼在剛出現窗口的時候,也應該沒有用啊。帶着疑問翻書,原來:“即使你所編寫的程序始終以全屏模式運行,這個窗口仍然存在改變大小的時刻,也就是當它被創建時。”

而對於這段代碼:

當我把glViewport()之後的內容都註釋掉後,仍然是一個充滿整個空間的紅矩形。在第一個glLoadIdentity()之後仍然如此。當我改成這樣後:  

只有當第一次出現時有矩形,改變大小後就沒有了。其實僅有一個函數是真正起作用的,即glOrtho()只要將這個函數放在RenderScence()畫圖形之前就行了。但是仍然不會在改變大小後出現。而如果在glOrtho()之前,放上  glMatrixMode(GL_PROJECTION); glLoadIdentity();就可以了。哦,其實只要glLoadIdentity()就可以了,這是我在寫到後一段時感悟的。書上是這樣說的:

投影矩陣就是實際定義可視區域的地方。你需要調用一次glLoadIdentity()函數,因爲glOrtho函數實際上並不建立裁剪區域,而是修改原有的裁剪區域。他把描述當前裁剪區域的矩陣與參數所提供的裁剪區域矩陣想成。現在,你只需要知道調用glLoadIdentity()函數的目的是在執行任何矩陣乘法操作之前對當前的座標系統“重置”,在glOtho()被調用之後,每個後續的glOrtho()調用將會導致目標裁剪區域被破壞,甚至導致矩形無法顯示!!!

第三個例子:

如果將glutPostRedisplay();註釋掉,那麼矩形就不動了,只有在窗口最小化或。。後出發了RenderScence()纔會看到瞬移了的矩形。其實用單緩存還是雙緩存影響的效果並不大,沒有發現明顯的閃爍。還有在單緩存下使用glSwapBuffers()是沒有反應的,整個窗口顯示爲白白的,根本就沒有flush。而書上說的仍然執行刷新任務並不正確啊!

 

下一節OpenGL狀態機,沒有看懂!!!

 

總結一下,可以用glFinish()和glFlush()來牽制執行所有尚未執行的渲染命令,但是glFinish()是會阻塞的,而glFlush()並不阻塞,是一種異步的渲染模式。

glut的有用函數:

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章