VC环境下基于OpenGL的编程_第1页
VC环境下基于OpenGL的编程_第2页
VC环境下基于OpenGL的编程_第3页
VC环境下基于OpenGL的编程_第4页
VC环境下基于OpenGL的编程_第5页
已阅读5页,还剩4页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

VC环境下基于OpenGL的编程2007-05—2220:51这篇文章介绍一下在VC环境中建立OpenGL标准的应用程序框架的简略方法与步骤:ﻫ(1)创建项目文件:选择File|New菜单项,建立一个名为ProjectTemplate的项目文件,ProjectTemplate基于单文档(SDI),View类基于CView。ﻫ(2)选择Project|Settings菜单项,在Link选项组的Object/libraryﻫmodules列表框中添加opengl32。libglu32。libglaux.lib中间用空格隔开ﻫ(3)选择View|ClassWizard菜单项,打开MFCClassWizard对话框,在Classﻫname列表框中选择CProjectTemplateView类,进行一下操作:ﻫ

选择WM_CREATE消息,单击AddFunction按钮添加OnCreate()函数,再单击EditﻫCode按钮,将初始化代码添加到OnCreate()函数中:ﻫ

PIXELFORMATDESCRIPTORpfd=ﻫ{ﻫ

sizeof(PIXELFORMATDESCRIPTOR),

1,

PFD_DRAW_TO_WINDOW|PFD_SUPPORT_OPENGL,ﻫ

PFD_TYPE_RGBA,ﻫ

24,

0,0,0,0,0,0,ﻫ

0,0,0,0,0,0,0,ﻫ

32,ﻫ

0,0,ﻫ

PFD_MAIN_PLANE,ﻫ

0,ﻫ

0,0,0ﻫ};

CClientDCdc(this);ﻫintpixelFormat=ChoosePixelFormat(dc.m_hDC,&pfd);ﻫBOOLsuccess=SetPixelFormat(dc.m_hDC,pixelFormat,&pfd);ﻫm_hRC=wglCreateContext(dc。m_hDC);ﻫ

同上,选择WM_DESTROY消息,在OnDestroy()中添加以下代码:ﻫ

wglDeleteContext(m_hRC);ﻫ

ﻫ在ProjectTemplateView。cpp中,将以下代码添加到PreCreateWindows()函数中:ﻫ

cs.style|=WS_CLIPCHILDREN|WS_CLIPSIBLINGS;

OpenGL只对WS_CLIPCHILDREN|WS_CLIPSIBLINGS类型窗口有效;ﻫ

在ProjectTemplateView.cpp中,将以下代码添加到OnDraw()函数中:ﻫ

wglMakeCurrent(pDC->m_hDC,m_hRC);ﻫ

DrawScene();

//用户自定义函数,用于绘制三维场景ﻫ

wglMakeCurrent(pDC->m_hDC,NULL);ﻫ

在ProjectTemplateView。cpp中,添加成员函数voidﻫDrawScene();/*简略方法我就不用多说了吧,将树形窗口切换到ClassView,右键单击CProjectTemplateView,选择AddMemberFunction*/

(4)在ProjectTemplateView.h中包含以下头文件并添加类成员声明:

#include〈gl/gl.h>

#include〈gl/glu.h>

#include<gl/glaux.h>ﻫ在CProjectTemplateView类中的projected:段中添加成员变量声明:ﻫ

HGLRCm_hRC;ﻫ这样,一个基于OpenGL标准的程序框架已经构造好了,你只需在DrawScene()函数中添加程序代码即可实现你盼望的功能了。:)一、前言人生在于折腾,连续折腾吧。OpenGL编程的红宝书《OpenGLProgrammingGuide》在举例子的时候为了平台无关,使用的都是GLUT来管理窗口,个人感觉不爽-_-!要是针对HYPERLINK"http://www.q.cc/dev/os/windows/"\t"_blank"Windows平台,个人倾向使用Win32(MFC也行),要是跨平台,我还会Qt嘛,Qt对OpenGL也有很好的支持的,为啥还折腾个新的窗口管理组件?虽然说GLUT比较简洁,但是还是不喜爱扭曲的适应之,何况我去看了下GLUT这个东西,最新的版本都是2001年发布的了,什么古董级的家伙啊,更加不想用了,还是在HYPERLINK"http://www.q。cc/school/os/windows/"\t"_blank”Windows平台上学习OpenGL吧.刚开头这样想的就这样做了,结果比我想象的略微简洁一些,原来不光是熟识Win32API就能随便搞掂的,当时还看到有人专门为此写了篇论文-_—!(不知道学历)吓到我了,没有那么高的学术讨论价值吧?后来又看到3个讨论生都开头为此写论文了(这还真是讨论院中的人写的),感叹不已。二、提要本文主要介绍Win32下的OpenGL编程需要的一些操作,以AndreLaMothe的T3DGameConsole为Win32框架实现一个Win32下的OpenGLHYPERLINK"http://www.q.cc/game/"\t"_blank”游戏编程框架,以参考资料2为蓝本,实现一些OpenGL示例。以后的讲解围绕此框架展开。本文假设读者已经具备基本的Win32编程知识,不讲解Win32编程中固有的要素,需要了解Win32编程的,建议学习CharlesPetzold的《ProgrammingWindows》。三、Win32下OpenGL编程需要的操作步骤全部源代码见我的放在GoogleCode上的blog—sample-code中2009-9—27\Win32OpenGLTemplate名目。取回方式见本文最后的说明。下面会用到的全局变量://GLOBALS////////////////////////////////////////////////ﻫHWNDghWnd;//窗口句柄ﻫHINSTANCEghInstance;//程序实例句柄ﻫHDCghDC;//GDI设备环境句柄

HGLRCghRC;//渲染环境句柄1.头文件#include〈HYPERLINK”http://www.q.cc/dev/os/windows/"\t”_blank”Windows。h>

//OpenGL需要的头文件ﻫ#include<GL/gl。h〉ﻫ#include<GL/glu。h>需要注意的就是,必须先包含HYPERLINK"http://www.q。cc/school/os/windows/"\t"_blank"Windows。h,然后才能包含gl。h和glu。h。由于gl.h与glu。h中可能包含Windows。h中定义的宏.2。链接库此步完全可以通过功能配置来完成,需要包含的库为opengl32。lib何glu32.lib,事实上,为了便利,可以通过如下语句来完成(VHYPERLINK"http://www.q.cc/dev/language/c/”\t”_blank"C++特有特性),但是我们商量的是Win32下的OpenGL,这样也能接受了。//定义程序链接时所需要调用的OpenGL程序库,简化工程配置ﻫ#pragmacomment(lib,"opengl32.lib”)ﻫ#pragmacomment(lib,"glu32。lib")3.像素格式(PixelFormat)设置需要用到的函数的原型:intChoosePixelFormat(ﻫHDChdc,//devicecontexttosearchforabestpixelformat

//match

CONSTPIXELFORMATDESCRIPTOR*ppfd

//pixelformatforwhichabestmatchissoughtﻫ);ﻫﻫBOOLSetPixelFormat(ﻫHDChdc,//devicecontextwhosepixelformatthefunctionﻫ//attemptstosetﻫintiPixelFormat,ﻫ//pixelformatindex(one-based)ﻫCONSTPIXELFORMATDESCRIPTOR*ppfdﻫ//pointertologicalpixelformatspecificationﻫ);这是Win32下的OpenGL编程必做的事情之一,为DC设置像素的格式。//设置像素格式

PIXELFORMATDESCRIPTORpfd;ﻫintiFormat;ﻫﻫghDC=GetDC(ghWnd);

ﻫZeroMemory(&pfd,sizeof(pfd));ﻫpfd。nSize=sizeof(pfd);ﻫpfd.nVersion=1;//版本,一般设为ﻫpfd.dwFlags=PFD_DRAW_TO_WINDOW|//一组表明象素缓冲特性的标志位ﻫPFD_SUPPORT_OPENGL;ﻫpfd。iPixelType=PFD_TYPE_RGBA;//明象素数据类型是RGBA还是颜色索引;ﻫpfd.cColorBits=32;//每个颜色缓冲区中颜色位平面的数目,对颜色索引方式是缓冲区大小

pfd。iLayerType=PFD_MAIN_PLANE;//被忽视,为了全都性而包含的ﻫﻫiFormat=ChoosePixelFormat(ghDC,&pfd);//选择一个像素格式ﻫﻫSetPixelFormat(ghDC,iFormat,&pfd);//设置到DC中这样的函数完成了像素格式的设置,事实上还可以进行更多的操作,比如设置缓冲区等,下面的代码就是一个设置双重缓冲区的代码。PIXELFORMATDESCRIPTORpfd;ﻫZeroMemory(&pfd,sizeof(pfd));

pfd。nSize=sizeof(pfd);

pfd.nVersion=1;

pfd.dwFlags=PFD_DRAW_TO_WINDOW|PFD_SUPPORT_OPENGL|ﻫPFD_DOUBLEBUFFER;

pfd。iPixelType=PFD_TYPE_RGBA;ﻫpfd。cColorBits=32;ﻫpfd.cDepthBits=32;

pfd.iLayerType=PFD_MAIN_PLANE;ﻫintiFormat=ChoosePixelFormat(hDC,&pfd);ﻫSetPixelFormat(hDC,iFormat,&pfd);简略的每个参数的意义,最好还是去查查MSDN啦,查看PIXELFORMATDESCRIPTOR结构的解释就行。4。渲染器环境(RenderContext)创建调用wglCreateContext与wglMakeCurrent函数,这两个函数都是HYPERLINK"http://www.q.cc/dev/os/windows/"\t”_blank"Windows下为了兼容OpenGL而格外供应的接口,以wgl开头。函数原型:HGLRCwglCreateContext(

HDChdc//devicecontextofdevicethattherenderingcontextﻫ//willbesuitableforﻫ);ﻫﻫBOOLwglMakeCurrent(

HDChdc,//devicecontextofdevicethatOpenGLcallsareﻫ//tobedrawnonﻫHGLRChglrc//OpenGLrenderingcontexttobemadethecallingﻫ//thread'scurrentrenderingcontextﻫ);调用方式如下:ghRC=wglCreateContext(ghDC);//创建渲染环境

wglMakeCurrent(ghDC,ghRC);//使之成为当前渲染环境5.实际绘制这个部分就与一般的OpenGL全都,在后面渐渐展开叙述。6。释放资源首先取消当前的渲染环境选中,然后依次删除渲染环境与设备环境。需要调用的函数原型:BOOLwglDeleteContext(ﻫHGLRChglrc//handletotheOpenGLrenderingcontexttodeleteﻫ);

ﻫ//取消OpenGL,在程序结束前调用,释放渲染环境,设备环境以及最终窗口句柄。

voidDisableOpenGL()ﻫ{ﻫwglMakeCurrent(NULL,NULL);

wglDeleteContext(ghRC);ﻫReleaseDC(ghWnd,ghDC);

}上述流程基本就是一个完整的Win32OpenGL程序所需要的了。实际上在参考5中,有较为简略的论述,但是事实上,你也可以作为论文发表,见参考3.四、真正的OpenGL相关内容1。静态图形显示演示:一个矩形见参考2中(即所谓的OpenGL红宝书TheRedBook)中的例子基本流程分两部分,初始化和实际绘制://OpenGL初始化开头

voidSceneInit(intw,inth)ﻫ{ﻫglClearColor(0.0f,0。0f,0。0f,0.0f);//黑色背景ﻫﻫglMatrixMode(GL_PROJECTION);ﻫglLoadIdentity();

glOrtho(0。0,1。0,0。0,1.0,—1.0,1.0);ﻫ}ﻫﻫ//这里进行全部的绘图工作ﻫvoidSceneShow(GLvoid)ﻫ{

glClear(GL_COLOR_BUFFER_BIT);ﻫﻫglColor3f(1.0,1。0,1.0);ﻫglBegin(GL_POLYGON);ﻫglVertex3f(0.25,0.25,0.0);ﻫglVertex3f(0.75,0。25,0.0);ﻫglVertex3f(0.75,0.75,0.0);ﻫglVertex3f(0。25,0.75,0.0);ﻫglEnd();ﻫglFlush();ﻫ}显示效果格外简陋,就是黑色背景窗口中一个白色的矩形。OpenGLGL的每个函数意义不在此文中描述,本文的主要目的是叙述win32中OpenGL编程需要的操作.然后就是将全部的部分串起来了,上述都是代码的片段。全部源代码见我的放在GoogleCode上的blog-sample—code中2009-9—27\Win32OpenGLTemplate名目。取回方式见本文最后的说明.2.动画演示:一个旋转的矩形由于整体的框架使用了AndreLaMothe的T3DGameConsole,所以显示动画格外简洁.只不过需要注意的是,这里为了显示效果更好利用了双缓冲,那么上面的设置像素格式一步需要用其次种设置方式。全部的改动如下://激活创建OpenGL窗口ﻫvoidEnableOpenGL()

{ﻫPIXELFORMATDESCRIPTORpfd;

intiFormat;ﻫﻫghDC=GetDC(ghWnd);

ﻫZeroMemory(&pfd,sizeof(pfd));ﻫpfd。nSize=sizeof(pfd);

pfd。nVersion=1;//版本,一般设为

ﻫ//一组表明象素缓冲特性的标志位ﻫpfd。dwFlags=PFD_DRAW_TO_WINDOW|PFD_SUPPORT_OPENGL|PFD_DOUBLEBUFFER;ﻫpfd。iPixelType=PFD_TYPE_RGBA;//明象素数据类型是RGBA还是颜色索引;

pfd.cColorBits=32;//每个颜色缓冲区中颜色位平面的数目,对颜色索引方式是缓冲区大小ﻫpfd.cDepthBits=16;ﻫpfd.iLayerType=PFD_MAIN_PLANE;//被忽视,为了全都性而包含的ﻫﻫiFormat=ChoosePixelFormat(ghDC,&pfd);//选择一个像素格式

ﻫSetPixelFormat(ghDC,iFormat,&pfd);//设置到DC中ﻫﻫghRC=wglCreateContext(ghDC);//创建绘图描述表ﻫwglMakeCurrent(ghDC,ghRC);//

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论