openggl画图初学必看

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

OpenGL作图非常方便,故日益流行,但对许多人来说,是在微机上进行的,首先碰到的问题是,如何适应微机环境。这往往是最关键的一步,虽然也是最初级的。一般的,我不建议使用glut 包.那样难以充分发挥Windows 的界面上的功能.

下面介绍如何在VC++ 上进行OpenGL 编程。OpenGL 绘图的一般过程可以看作这样的,先用OpenGL 语句在OpenGL 的绘图环境RenderContext (RC)中画好图, 然后再通过一个Swap buffer 的过程把图传给操作系统的绘图环境DeviceContext (DC)中,实实在在地画出到屏幕上.

下面以画一条Bezier 曲线为例,详细介绍VC++ 上OpenGL编程的方法。文中给出了详细注释,以便给初学者明确的指引。一步一步地按所述去做,你将顺利地画出第一个OpenGL 平台上的图形来。

一、产生程序框架Test.dsw

New Project | MFC Application Wizard (EXE) | "Test" | OK

*注* : 加“”者指要手工敲入的字串

二、导入Bezier 曲线类的文件

用下面方法产生BezierCurve.h BezierCurve.cpp 两个文件:

WorkSpace | ClassView | Test Classes| <右击弹出> New Class | Generic Class(不用MFC类) | "CBezierCurve" | OK

三、编辑好Bezier 曲线类的定义与实现

写好下面两个文件:

BezierCurve.h BezierCurve.cpp

四、设置编译环境:

1. 在BezierCurve.h 和TestView.h 内各加上:

#include

#include

#include

2. 在集成环境中

Project | Settings | Link | Object/library module | "opengl32.lib glu32.lib glaux.lib" | OK

五、设置OpenGL 工作环境:(下面各个操作,均针对TestView.cpp )

1. 处理PreCreateWindow(): 设置OpenGL 绘图窗口的风格

cs.style |= WS_CLIPSIBLINGS | WS_CLIPCHILDREN | CS_OWNDC;

2. 处理OnCreate():创建OpenGL 的绘图设备。

OpenGL 绘图的机制是: 先用OpenGL 的绘图上下文Rendering Context (简称为RC )把图画好,再把所绘结果通过SwaPBuffer() 函数传给Window 的绘图上下文Device Context (简记为DC).要注意的是,程序运行过程中,可以有多个DC,但只能有一个RC。因此当一个DC 画完图后,要立即释放RC,以便其它的DC 也使用。在后面的代码中,将有详细注释。

int CTestView::OnCreate(LPCREATESTRUCT lpCreateStruct)

{

if (CView::OnCreate(lpCreateStruct) == -1)

return -1;

myInitOpenGL();

return 0;

}

void CTestView::myInitOpenGL()

{

m_pDC = new CClientDC(this); //创建DC

ASSERT(m_pDC != NULL);

if (!mySetupPixelFormat()) //设定绘图的位图格式,函数下面列出

return;

m_hRC = wglCreateContext(m_pDC->m_hDC);//创建RC

wglMakeCurrent(m_pDC->m_hDC, m_hRC); //RC 与当前DC 相关联

} //CClient * m_pDC; HGLRC m_hRC; 是CTestView 的成员变量

BOOL CTestView::mySetupPixelFormat()

{//我们暂时不管格式的具体内容是什么,以后熟悉了再改变格式

static PIXELFORMATDESCRIPTOR pfd =

{

sizeof(PIXELFORMATDESCRIPTOR), // size of this pfd

1, // version number

PFD_DRAW_TO_WINDOW | // support window

PFD_SUPPORT_OPENGL | // support OpenGL

PFD_DOUBLEBUFFER, // double buffered

PFD_TYPE_RGBA, // RGBA type

24, // 24-bit color depth

0, 0, 0, 0, 0, 0, // color bits ignored

0, // no alpha buffer

0, // shift bit ignored

0, // no accumulation buffer

0, 0, 0, 0, // accum bits ignored

32, // 32-bit z-buffer

0, // no stencil buffer

0, // no auxiliary buffer

PFD_MAIN_PLANE, // main layer

0, // reserved

0, 0, 0 // layer masks ignored

};

int pixelformat;

if ( (pixelformat = ChoosePixelFormat(m_pDC->m_hDC, &pfd)) == 0 ) {

MessageBox("ChoosePixelFormat failed");

return FALSE;

}

if (SetPixelFormat(m_pDC->m_hDC, pixelformat, &pfd) == FALSE)

{

MessageBox("SetPixelFormat failed");

return FALSE;

}

return TRUE;

}

3. 处理OnDestroy()

void CTestView::OnDestroy()

{

wglMakeCurrent(m_pDC->m_hDC,NULL); //释放与m_hDC 对应的RC wglDeleteContext(m_hRC); //删除RC

if (m_pDC)

delete m_pDC; //删除当前View 拥有的DC

CView::OnDestroy();

}

4. 处理OnEraseBkgnd()

相关文档
最新文档