win32下的OpenGL绘图环境框架.docx

上传人:b****7 文档编号:9567604 上传时间:2023-02-05 格式:DOCX 页数:27 大小:43.44KB
下载 相关 举报
win32下的OpenGL绘图环境框架.docx_第1页
第1页 / 共27页
win32下的OpenGL绘图环境框架.docx_第2页
第2页 / 共27页
win32下的OpenGL绘图环境框架.docx_第3页
第3页 / 共27页
win32下的OpenGL绘图环境框架.docx_第4页
第4页 / 共27页
win32下的OpenGL绘图环境框架.docx_第5页
第5页 / 共27页
点击查看更多>>
下载资源
资源描述

win32下的OpenGL绘图环境框架.docx

《win32下的OpenGL绘图环境框架.docx》由会员分享,可在线阅读,更多相关《win32下的OpenGL绘图环境框架.docx(27页珍藏版)》请在冰豆网上搜索。

win32下的OpenGL绘图环境框架.docx

win32下的OpenGL绘图环境框架

win32下的OpenGL绘图环境框架

Win32下OpenGL入门

主要的步骤包括:

添加opengl头文件,库文件,键盘鼠标响应,像素格式设置,opengl环境初始化,绘图变量设置,创建窗口,窗口大小改变时响应,绘制场景,源文件

1, 新建一个win32项目(注意,不是console程序),在添加过程中,创建一个空的项目,然后,在解决方案资源管理器的源文件树目录下,添加一个cpp文件,文件可以命名为mian.cpp

2, 添加绘图相关的头文件和库文件,在新建的main.cpp中,加入如下头文件:

 

#include                                        //Windows的头文件

#include                                                //HeaderFileForTheOpenGL32Library

#include                                              //HeaderFileForTheGLu32Library

#include                     //HeaderFileForTheGlauxLibrary

#include                                              //引入数学函数库中的Sin

#include                                               //HeaderFileForStandardInput/Output

在项目,配置属性-连接器-输入的附加依赖项里,加入opengl32.lib,glu32.lib,glaux.lib

glut.lib,如图所示。

3,为创建绘图窗口,定义基本的相关变量,这些变量在opengl绘图中,都必须用到。

HGLRC          hRC=NULL;  //窗口着色描述表句柄

HDC            hDC=NULL;   //OpenGL渲染描述表句柄

HWND           hWnd=NULL;                   //保存我们的窗口句柄

HINSTANCE      hInstance;    //保存程序的实例

第一行设置的变量是RenderingContext(着色描述表)。

每一个OpenGL都被连接到一个着色描述表上。

着色描述表将所有的OpenGL调用命令连接到DeviceContext(设备描述表)上。

我将OpenGL的着色描述表定义为hRC。

要让您的程序能够绘制窗口的话,还需要创建一个设备描述表,也就是第二行的内容。

Windows的设备描述表被定义为hDC。

DC将窗口连接到GDI(GraphicsDeviceInterface图形设备接口)。

而RC将OpenGL连接到DC。

第三行的变量hWnd将保存由Windows给我们的窗口指派的句柄。

最后,第四行为我们的程序创建了一个Instance(实例)。

 

4,为响应键盘,鼠标等操作,以及窗口活动情况,是否全屏等

bool           keys[256];                    //保存键盘按键的数组

bool           active=TRUE;               //窗口的活动标志,缺省为TRUE

bool           fullscreen=TRUE;        //全屏标志缺省,缺省设定成全屏模式

GLfloat            rtri;    //用于几何体旋转的角度

active变量用来告知程序窗口是否处于最小化的状态。

如果窗口已经最小化的话,我们可以做从暂停代码执行到退出程序的任何事情。

我喜欢暂停程序。

这样可以使得程序不用在后台保持运行。

fullscreen变量的作用相当明显。

如果我们的程序在全屏状态下运行,fullscreen的值为TRUE,否则为FALSE。

这个全局变量的设置十分重要,它让每个过程都知道程序是否运行在全屏状态下。

 

5,我们需要先定义WndProc()。

必须这么做的原因是CreateGLWindow()有对WndProc()的引用,但WndProc()在CreateGLWindow()之后才出现。

在C语言中,如果我们想要访问一个当前程序段之后的过程和程序段的话,必须在程序开始处先申明所要访问的程序段。

所以下面的一行代码先行定义了WndProc(),使得CreateGLWindow()能够引用WndProc()。

LRESULT CALLBACKWndProc(HWND,UINT,WPARAM,LPARAM);  //WndProc的定义

 

6,绘图视口的尺寸以及在窗口大小改变时的响应函数。

不管窗口的大小是否已经改变(假定您没有使用全屏模式)。

甚至您无法改变窗口的大小时(例如您在全屏模式下),它至少仍将运行一次--在程序开始时设置我们的透视图。

OpenGL场景的尺寸将被设置成它显示时所在窗口的大小。

GLvoidReSizeGLScene(GLsizeiwidth,GLsizeiheight)  //重置OpenGL窗口大小

{

                   if(height==0)                                                       //防止被零除

                   {

                                        height=1;                                           //将Height设为1

                   }

 

                   glViewport(0,0,width,height);                          //重置当前的视口glMatrixMode(GL_PROJECTION);                           //选择投影矩阵

                   glLoadIdentity();                                                   //重置投影矩阵

 

                   //设置投影模式为透视投影

                   gluPerspective(45.0f,(GLfloat)width/(GLfloat)height,0.1f,100.0f);

 

                   glMatrixMode(GL_MODELVIEW);                    //选择模型观察矩阵

                   glLoadIdentity();                                                   //重置模型观察矩阵

}

透视图设置屏幕。

意味着越远的东西看起来越小。

这么做创建了一个现实外观的场景。

此处透视按照基于窗口宽度和高度的45度视角来计算。

0.1f,100.0f是我们在场景中所能绘制深度的起点和终点。

glMatrixMode(GL_PROJECTION)指明接下来的两行代码将影响projectionmatrix(投影矩阵)。

投影矩阵负责为我们的场景增加透视。

glLoadIdentity()近似于重置。

它将所选的矩阵状态恢复成其原始状态。

调用glLoadIdentity()之后我们为场景设置透视图。

glMatrixMode(GL_MODELVIEW)指明任何新的变换将会影响modelviewmatrix(模型观察矩阵)。

模型观察矩阵中存放了我们的物体讯息。

最后我们重置模型观察矩阵。

如果您还不能理解这些术语的含义,请别着急。

在以后的教程里,我会向大家解释。

只要知道如果您想获得一个精彩的透视场景的话,必须这么做。

 

7,接下的代码段中,我们将对OpenGL进行所有的设置。

我们将设置清除屏幕所用的颜色,打开深度缓存,启用smoothshading(阴影平滑),等等。

这个例程直到OpenGL窗口创建之后才会被调用。

此过程将有返回值。

但我们此处的初始化没那么复杂,现在还用不着担心这个返回值

intInitGL(GLvoid)                            //此处开始对OpenGL进行所有设置

{

glShadeModel(GL_SMOOTH);                //启用阴影平滑

glClearColor(0.0f,0.0f,0.0f,0.0f);          //黑色背景

glClearDepth(1.0f);                                    //设置深度缓存

glEnable(GL_DEPTH_TEST);                 //启用深度测试

glDepthFunc(GL_LEQUAL);//所作深度测试的类型

glHint(GL_PERSPECTIVE_CORRECTION_HINT,GL_NICEST);//告诉系统对透视进行修正

returnTRUE;                                                //初始化OK

}

GL_SMOOTH:

阴影平滑通过多边形精细的混合色彩,并对外部光进行平滑。

我将在另一个教程中更详细的解释阴影平滑。

深度缓存:

将深度缓存设想为屏幕后面的层。

深度缓存不断的对物体进入屏幕内部有多深进行跟踪。

几乎所有在屏幕上显示3D场景OpenGL程序都使用深度缓存。

它的排序决定那个物体先画。

这样您就不会将一个圆形后面的正方形画到圆形上来。

深度缓存是OpenGL十分重要的部分。

 

8,绘图部分。

下一段包括了所有的绘图代码。

任何您所想在屏幕上显示的东东都将在此段代码中出现。

这里,绘制了一个简单的金字塔,每个顶点采用不用的颜色

intDrawGLScene(GLvoid)                                 //从这里开始进行所有的绘制

{

                   glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);     //清除屏幕和深度缓存

                   glLoadIdentity();                                                   //重置当前的模型观察矩阵

                   glTranslatef(-1.5f,0.0f,-6.0f);                             //左移1.5单位,并移入屏幕6.0

                   glRotatef(rtri,0.0f,1.0f,0.0f);           //绕Y轴旋转金字塔

 

                   glBegin(GL_TRIANGLES);                                 //开始绘制金字塔的各个面

                                        glColor3f(1.0f,0.0f,0.0f);                                                         //红色

                                        glVertex3f(0.0f,1.0f,0.0f);            //三角形的上顶点(前侧面)

                                        glColor3f(0.0f,1.0f,0.0f);                                     //绿色

                                        glVertex3f(-1.0f,-1.0f,1.0f);                               //三角形的左下顶点(前侧面)

                                        glColor3f(0.0f,0.0f,1.0f);                                     //蓝色

                                        glVertex3f(1.0f,-1.0f,1.0f);                                //三角形的右下顶点(前侧面)

                                        glColor3f(1.0f,0.0f,0.0f);                                     //红色

                                        glVertex3f(0.0f,1.0f,0.0f);                                //三角形的上顶点(右侧面)

                                        glColor3f(0.0f,0.0f,1.0f);                                     //蓝色

                                        glVertex3f(1.0f,-1.0f,1.0f);                                //三角形的左下顶点(右侧面)

                                        glColor3f(0.0f,1.0f,0.0f);                //绿色

                                        glVertex3f(1.0f,-1.0f,-1.0f);                              //三角形的右下顶点(右侧面)

                                        glColor3f(1.0f,0.0f,0.0f);                                     //红色

                                        glVertex3f(0.0f,1.0f,0.0f);                                //三角形的上顶点(后侧面)

                                        glColor3f(0.0f,1.0f,0.0f);                                                         //绿色

                                        glVertex3f(1.0f,-1.0f,-1.0f);                              //三角形的左下顶点(后侧面)

                                        glColor3f(0.0f,0.0f,1.0f);                                                         //蓝色

                                        glVertex3f(-1.0f,-1.0f,-1.0f);                              //三角形的右下顶点(后侧面)

                                        glColor3f(1.0f,0.0f,0.0f);                                                         //红色

                                        glVertex3f(0.0f,1.0f,0.0f);                                //三角形的上顶点(左侧面)

                                        glColor3f(0.0f,0.0f,1.0f);                                                         //蓝色

                                        glVertex3f(-1.0f,-1.0f,-1.0f);                               //三角形的左下顶点(左侧面)

                                        glColor3f(0.0f,1.0f,0.0f);                                                         //绿色

                                        glVertex3f(-1.0f,-1.0f,1.0f);                               //三角形的右下顶点(左侧面)

                   glEnd();     

                   rtri+=0.2f;                      //增加三角形的旋转变量

                                                                                

                   returnTRUE;                                                                             

}

关于绘图:

在opengl里面绘图,首先要了解的就是坐标原点,OpenGL的坐标原点默认情况下,在屏幕中心。

OpenGL的坐标系统是右手坐标系统,默认情况下,屏幕朝上为y,朝左为x,朝外为z。

9,释放程序的绘图指针。

在程序退出之前调用。

KillGLWindow()的作用是依次释放着色描述表,设备描述表和窗口句柄。

GLvoidKillGLWindow(GLvoid)     //正常销毁窗口

{

                   if(fullscreen)                //我们处于全屏模式吗?

                   {

                                        ChangeDisplaySettings(NULL,0);                    //是的话,切换回桌面,因为全屏模式直接关闭窗口,可能引发错误

                                        ShowCursor(TRUE);                                           //显示鼠标指针

                   }

                   if(hRC)                                                                  //我们拥有OpenGL渲染描述表吗?

                   {

                                        if(!

wglMakeCurrent(NULL,NULL))                  //我们能否释放DC和RC描述表?

                                        {

                                                            MessageBox(NULL,"释放DC或RC失败。

","关闭错误",MB_OK|MB_ICONINFORMATION);

                                        }

                                        if(!

wglDeleteContext(hRC))          //我们能否删除RC?

                                        {

                                                            MessageBox(NULL,"释放RC失败。

","关闭错误",MB_OK|MB_ICONINFORMATION);

                                        }

                                        hRC=NULL;                                                          //将RC设为NULL

                   }

                   if(hDC&&!

ReleaseDC(hWnd,hDC))                                  //我们能否释放DC?

                   {

                                        MessageBox(NULL,"释放DC失败。

","关闭错误",MB_OK|MB_ICONINFORMATION);

    

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 高等教育 > 文学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1