一些OpenGL的筆記
gluPerspective
gluPerspective的用法:
void gluPerspective( GLdouble fovy, //角度 GLdouble aspect,//視景體的寬高比 GLdouble zNear,//沿z軸方向的兩裁面之間的距離的近處 GLdouble zFar //沿z軸方向的兩裁面之間的距離的遠處 );
記住,預設情況(也就是使用以下的語句)
glMatrixMode( GL_PROJECTION );glLoadIdentity( );
下,視口是朝向Z軸的負半軸的,我們在使用gluPerspective函數的時候,zNear和zFar是相對於我們的視口定義的。所以繪製圖形的時候,決不能認為我們圖形的z軸座標是正的才能顯示,恰恰相反,z軸座標是負的才能顯示。
注意:gluPerspective()函數中zNear一定要大於0,一旦等於0或小於0,則無法顯示所有的三維物體。
當然了zFar要大於zNear,要不然也無法顯示。
GlutPostRedisplay以及畫面
注意:glutPostRedisplay()函數不能在渲染線程以外被調用,寫在渲染線程之外的話調用將無效。
為什麼我的畫面在動的時候,移動視窗會出現一些延遲(俗稱“有些卡”)?
因為遊戲的繪製基本上在一個線程內進行,視窗化的程式FPS一般是60,取決於你設定的重新整理率。這就意味著你在移動視窗的時候,系統同時要保證1秒內畫面重新整理60次,也就是說,1/60秒內才有一次響應你移動視窗的操作,我想一般的視窗不會這麼頻繁地重新整理吧。所以呢,移動視窗會出現一些延遲,這是正常的。有的時候一些大型的遊戲在進行密集GPU操作的時候,不也出現了移動視窗無法響應或者響應很慢的情況嗎?
裁剪
glEnable( GL_DEPTH_TEST );// 使用深度測試glFrontFace( GL_CW ); // 順時針的繪製為正面glEnable( GL_CULL_FACE ); // 剔除不是正面的面
如果讓順時針繪製的圖形位正面,那麼我們一旦畫出了逆時針的圖形,那麼將不會顯示,因為不是正面的面已經被剔除掉了。
顯示列表
聲明顯示列表與渲染顯示列表要倒置,否則無法渲染後聲明的顯示列表。例如:
void Init( void ){ glNewList( list1, GL_COMPILE ); … glEndList( ); glNewList( list2, GL_COMPILE ); … glEndList( );}void Render( void ){ /* 錯誤:無法顯示list2。 glCallList( list1 ); glCallList( list2 ); */ glCallList( list2 ); glCallList( list1 );}