OpenGL下實現圖片滿屏顯示
轉自:http://blog.csdn.net/dizuo/article/details/7596242
實現圖片滿屏顯示,最常用的用途是把一張圖片作為顯示窗體的背景圖片。我這里有總兩種方法:
一、 正交模式顯示背景圖片
- 關閉深度測試
- 正交投影
- 設置四邊形的尺寸為窗口四個角,將圖片貼到Quad上
- 切換到透視模式下
- 開啟深度測試
- 顯示三維場景
繪制背景圖片時必須關閉深度測試,否則會導致后面渲染的3d場景不能顯示。
在繪制3d場景時開啟深度測試是為了保證3D模型繪制的正確性,主要指彼此的遮擋關系。
示例代碼:
1 void display(void) 2 { 3 glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT ); 4 glColor3f (1.0, 1.0, 1.0); 5 6 glDisable(GL_DEPTH_TEST); 7 8 // 切換到正交模式 9 glMatrixMode(GL_PROJECTION); 10 glLoadIdentity(); 11 glOrtho(0, g_fWidth, 0, g_fHeight, 0, g_fDepth); 12 glMatrixMode(GL_MODELVIEW); 13 glLoadIdentity(); 14 15 glDisable(GL_LIGHTING); 16 glEnable(GL_TEXTURE_2D); 17 glBindTexture( GL_TEXTURE_2D, g_textureID ); 18 glInterleavedArrays( GL_T2F_V3F, 0, g_bgVertices ); 19 glDrawArrays( GL_QUADS, 0, 4 ); // 繪制背景圖片 20 glEnable(GL_LIGHTING); 21 glDisable(GL_TEXTURE_2D); 22 23 // 切換到三維場景 24 glMatrixMode (GL_PROJECTION); //回復原有的設置 25 glLoadIdentity (); 26 gluPerspective(30, g_fWidth/g_fHeight, 0.001, 100.0); 27 glMatrixMode(GL_MODELVIEW); 28 glLoadIdentity (); 29 gluLookAt(0, 5, 5, 0, 0, 0, 0, 1, 0); 30 31 glEnable(GL_DEPTH_TEST); 32 33 glPushMatrix(); 34 { 35 glTranslatef(0, 0, 0); 36 37 glRotatef(g_xAngle, 1, 0, 0); 38 glRotatef(g_yAngle, 0, 1, 0); 39 40 glCallList(g_modelId); // 繪制三維圖形 41 } glPopMatrix(); 42 43 glFlush(); 44 // glutPostRedisplay(); 45 }
二、 透視模式顯示背景圖片
背景圖片和3d場景都在透視模式下顯示,此時為了精確實現圖片滿屏,需要將窗口四個角的坐標投影到3d場景中,計算出對應的四邊形四個角坐標,然后圖片貼上去。步驟如下:
- 窗口四角 投影到3d場景中,使用gluUnProject函數 計算出新的quad
- 關閉深度測試
- 繪制quad,貼圖
- 開啟深度測試
- 繪制3d場景
示例代碼:
1 void display(void) 2 { 3 glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT ); 4 glColor3f (1.0, 1.0, 1.0); 5 6 ComputeBackgroundQuad(); 7 8 glDisable(GL_DEPTH_TEST); 9 10 // 繪制背景圖片 11 glDisable(GL_LIGHTING); 12 glEnable(GL_TEXTURE_2D); 13 glBindTexture( GL_TEXTURE_2D, g_textureID ); 14 15 glEnableClientState( GL_VERTEX_ARRAY ); 16 glEnableClientState( GL_TEXTURE_COORD_ARRAY ); 17 glInterleavedArrays( GL_T2F_V3F, 0, g_bgVertices ); 18 glDrawArrays( GL_QUADS, 0, 4 ); 19 glDisableClientState( GL_VERTEX_ARRAY ); 20 glDisableClientState( GL_TEXTURE_COORD_ARRAY ); 21 22 glDisable(GL_TEXTURE_2D); 23 24 glEnable(GL_LIGHTING); 25 26 glEnable(GL_DEPTH_TEST); 27 28 glPushMatrix(); 29 { 30 glTranslatef(0, 0, g_fOffset); 31 32 glRotatef(g_xAngle, 1, 0, 0); 33 glRotatef(g_yAngle, 0, 1, 0); 34 35 glCallList(g_modelId); 36 } glPopMatrix(); 37 38 glFlush(); 39 // glutPostRedisplay(); 40 }
1 void ComputeBackgroundQuad() 2 { 3 GLint viewport[4]; 4 GLdouble projMatrix[16]; 5 GLdouble modelMatrix[16]; 6 7 // glGetDoublev(GL_PROJECTION, projMatrix); 缺少matrix但是編譯不報錯~ 8 glGetDoublev(GL_PROJECTION_MATRIX, projMatrix); 9 glGetDoublev(GL_MODELVIEW_MATRIX, modelMatrix); 10 glGetIntegerv(GL_VIEWPORT, viewport); 11 12 // 13 double objX, objY, objZ; 14 const double winZ = 0; // 0 / 1 15 gluUnProject(0, 0, winZ, modelMatrix, projMatrix, viewport, &objX, &objY, &objZ); 16 g_bgVertices[0].x = objX; 17 g_bgVertices[0].y = objY; 18 g_bgVertices[0].z = objZ; 19 20 gluUnProject(g_fWidth, 0, winZ, modelMatrix, projMatrix, viewport, &objX, &objY, &objZ); 21 g_bgVertices[1].x = objX; 22 g_bgVertices[1].y = objY; 23 g_bgVertices[1].z = objZ; 24 25 gluUnProject(g_fWidth, g_fHeight, winZ, modelMatrix, projMatrix, viewport, &objX, &objY, &objZ); 26 g_bgVertices[2].x = objX; 27 g_bgVertices[2].y = objY; 28 g_bgVertices[2].z = objZ; 29 30 gluUnProject(0, g_fHeight, winZ, modelMatrix, projMatrix, viewport, &objX, &objY, &objZ); 31 g_bgVertices[3].x = objX; 32 g_bgVertices[3].y = objY; 33 g_bgVertices[3].z = objZ; 34 }
最終的效果如圖:

浙公網安備 33010602011771號