OpenGL: OpenGL下实现图片满屏显示
来源:互联网 发布:finecms源码 编辑:程序博客网 时间:2024/06/15 19:19
实现图片满屏显示,最常用的用途是把一张图片作为显示窗体的背景图片。我这里有总两种方法:
一、 正交模式显示背景图片
- 关闭深度测试
- 正交投影
- 设置四边形的尺寸为窗口四个角,将图片贴到Quad上
- 切换到透视模式下
- 开启深度测试
- 显示三维场景
绘制背景图片时必须关闭深度测试,否则会导致后面渲染的3d场景不能显示。
在绘制3d场景时开启深度测试是为了保证3D模型绘制的正确性,主要指彼此的遮挡关系。
示例代码:
void display(void){ glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT ); glColor3f (1.0, 1.0, 1.0); glDisable(GL_DEPTH_TEST);// 切换到正交模式 glMatrixMode(GL_PROJECTION); glLoadIdentity(); glOrtho(0, g_fWidth, 0, g_fHeight, 0, g_fDepth); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); glDisable(GL_LIGHTING);glEnable(GL_TEXTURE_2D);glBindTexture( GL_TEXTURE_2D, g_textureID ); glInterleavedArrays( GL_T2F_V3F, 0, g_bgVertices ); glDrawArrays( GL_QUADS, 0, 4 );// 绘制背景图片glEnable(GL_LIGHTING);glDisable(GL_TEXTURE_2D); // 切换到三维场景 glMatrixMode (GL_PROJECTION); //回复原有的设置 glLoadIdentity (); gluPerspective(30, g_fWidth/g_fHeight, 0.001, 100.0);glMatrixMode(GL_MODELVIEW); glLoadIdentity (); gluLookAt(0, 5, 5, 0, 0, 0, 0, 1, 0);glEnable(GL_DEPTH_TEST);glPushMatrix();{glTranslatef(0, 0, 0);glRotatef(g_xAngle, 1, 0, 0);glRotatef(g_yAngle, 0, 1, 0);glCallList(g_modelId);// 绘制三维图形} glPopMatrix();glFlush();// glutPostRedisplay();}
二、 透视模式显示背景图片
背景图片和3d场景都在透视模式下显示,此时为了精确实现图片满屏,需要将窗口四个角的坐标投影到3d场景中,计算出对应的四边形四个角坐标,然后图片贴上去。步骤如下:
- 窗口四角 投影到3d场景中,使用gluUnProject函数 计算出新的quad
- 关闭深度测试
- 绘制quad,贴图
- 开启深度测试
- 绘制3d场景
void display(void){ glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT ); glColor3f (1.0, 1.0, 1.0); ComputeBackgroundQuad();glDisable(GL_DEPTH_TEST);// 绘制背景图片glDisable(GL_LIGHTING);glEnable(GL_TEXTURE_2D);glBindTexture( GL_TEXTURE_2D, g_textureID );glEnableClientState( GL_VERTEX_ARRAY );glEnableClientState( GL_TEXTURE_COORD_ARRAY ); glInterleavedArrays( GL_T2F_V3F, 0, g_bgVertices ); glDrawArrays( GL_QUADS, 0, 4 );glDisableClientState( GL_VERTEX_ARRAY );glDisableClientState( GL_TEXTURE_COORD_ARRAY );glDisable(GL_TEXTURE_2D);glEnable(GL_LIGHTING);glEnable(GL_DEPTH_TEST);glPushMatrix();{glTranslatef(0, 0, g_fOffset);glRotatef(g_xAngle, 1, 0, 0);glRotatef(g_yAngle, 0, 1, 0);glCallList(g_modelId);} glPopMatrix();glFlush();// glutPostRedisplay();}
void ComputeBackgroundQuad(){GLintviewport[4];GLdouble projMatrix[16];GLdouble modelMatrix[16];// glGetDoublev(GL_PROJECTION, projMatrix); 缺少matrix但是编译不报错~glGetDoublev(GL_PROJECTION_MATRIX, projMatrix);glGetDoublev(GL_MODELVIEW_MATRIX, modelMatrix);glGetIntegerv(GL_VIEWPORT, viewport);// double objX, objY, objZ;const double winZ = 0; // 0 / 1gluUnProject(0, 0, winZ, modelMatrix, projMatrix, viewport, &objX, &objY, &objZ);g_bgVertices[0].x = objX;g_bgVertices[0].y = objY;g_bgVertices[0].z = objZ;gluUnProject(g_fWidth, 0, winZ, modelMatrix, projMatrix, viewport, &objX, &objY, &objZ);g_bgVertices[1].x = objX;g_bgVertices[1].y = objY;g_bgVertices[1].z = objZ;gluUnProject(g_fWidth, g_fHeight, winZ, modelMatrix, projMatrix, viewport, &objX, &objY, &objZ);g_bgVertices[2].x = objX;g_bgVertices[2].y = objY;g_bgVertices[2].z = objZ;gluUnProject(0, g_fHeight, winZ, modelMatrix, projMatrix, viewport, &objX, &objY, &objZ);g_bgVertices[3].x = objX;g_bgVertices[3].y = objY;g_bgVertices[3].z = objZ;}
最终的效果如图:
0 0
- OpenGL: OpenGL下实现图片满屏显示
- OpenGL下实现图片满屏显示
- OpenGL: 图片满屏显示
- OpenGL: OpenGL实现立体显示
- OpenGL显示图片
- OpenGL显示图片
- OpenGL: 显示图片
- OpenGL显示图片
- OpenGL实现立体显示
- OpenGL: 实现立体显示
- OpenGL立体显示实现
- opengl下png图片的加载与显示
- QT+OpenGL读取显示图片
- OpenGL 下的文字显示
- Android下Opengl ES实现单屏幕双眼显示
- opengl 显示图片以及保存图片
- WIN32 实现OPenGL显示源码
- 图片拼接镶嵌(OpenGL实现)
- discount mac cosmetics If you do this regularly for a few weeks
- Linux 动态库(http://blog.csdn.net/ldong2007/article/details/3194187)
- cheap cosmetics El centro de atenci es
- Segmentation fault (core dumped)
- cheap cosmetics From florals to dotted Swiss to animal prints
- OpenGL: OpenGL下实现图片满屏显示
- Octet 和 Byte 的区别
- 数字图像处理-空间域图像增强(一)(图像反转,对数变换,幂次变换、分段线性变换)
- java解析城市代码
- malformed or corrupted AST file。。。module file out of date'
- [SGU 101] Domino [欧拉回路]
- Windows下adb编译详解
- 收藏centeros 开放端口的方法
- baidu map develop