OpenGL最好的入门和提高教材Word文档格式.docx

上传人:b****1 文档编号:5746378 上传时间:2023-05-05 格式:DOCX 页数:14 大小:21.05KB
下载 相关 举报
OpenGL最好的入门和提高教材Word文档格式.docx_第1页
第1页 / 共14页
OpenGL最好的入门和提高教材Word文档格式.docx_第2页
第2页 / 共14页
OpenGL最好的入门和提高教材Word文档格式.docx_第3页
第3页 / 共14页
OpenGL最好的入门和提高教材Word文档格式.docx_第4页
第4页 / 共14页
OpenGL最好的入门和提高教材Word文档格式.docx_第5页
第5页 / 共14页
OpenGL最好的入门和提高教材Word文档格式.docx_第6页
第6页 / 共14页
OpenGL最好的入门和提高教材Word文档格式.docx_第7页
第7页 / 共14页
OpenGL最好的入门和提高教材Word文档格式.docx_第8页
第8页 / 共14页
OpenGL最好的入门和提高教材Word文档格式.docx_第9页
第9页 / 共14页
OpenGL最好的入门和提高教材Word文档格式.docx_第10页
第10页 / 共14页
OpenGL最好的入门和提高教材Word文档格式.docx_第11页
第11页 / 共14页
OpenGL最好的入门和提高教材Word文档格式.docx_第12页
第12页 / 共14页
OpenGL最好的入门和提高教材Word文档格式.docx_第13页
第13页 / 共14页
OpenGL最好的入门和提高教材Word文档格式.docx_第14页
第14页 / 共14页
亲,该文档总共14页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

OpenGL最好的入门和提高教材Word文档格式.docx

《OpenGL最好的入门和提高教材Word文档格式.docx》由会员分享,可在线阅读,更多相关《OpenGL最好的入门和提高教材Word文档格式.docx(14页珍藏版)》请在冰点文库上搜索。

OpenGL最好的入门和提高教材Word文档格式.docx

提供最基本的绘图函数

工具库

glu32.lib

gl/glu.h

glu

设置观察角度和投影矩阵、处理纹理图像、进行坐标变换、镶嵌多边形、绘制曲面、出错处理

扩展

Windows

[wingdi.h]

wgl

将OpenGL与Windows的窗口系统联系起来,管理绘图描述表、显示列表、执行函数和字体位图,支持窗口的像素格式和双缓冲机制

辅助库

glaux.lib

gl/glaux.h

aux

管理窗口、处理输入事件、载入颜色映射、绘制三维物体、指定空闲/重绘函数

Unix平台 

Windows平台

其中:

GLU=OpenGLUtilityLibrary,GLX=GraphicsLibraryofXwindowsystem

GDU=GraphicsDeviceUtility,WGL=WindowsGraphicsLibrary

下面是Windows平台辅助库中的若干三维物体绘制函数:

voidauxWireSphere(GLdouble);

voidauxSolidSphere(GLdouble);

voidauxWireCube(GLdouble);

voidauxSolidCube(GLdouble);

voidauxWireBox(GLdouble,GLdouble,GLdouble);

voidauxSolidBox(GLdouble,GLdouble,GLdouble);

voidauxWireTorus(GLdouble,GLdouble);

voidauxSolidTorus(GLdouble,GLdouble);

voidauxWireCylinder(GLdouble,GLdouble);

voidauxSolidCylinder(GLdouble,GLdouble);

voidauxWireIcosahedron(GLdouble);

voidauxSolidIcosahedron(GLdouble);

voidauxWireOctahedron(GLdouble);

voidauxSolidOctahedron(GLdouble);

voidauxWireTetrahedron(GLdouble);

voidauxSolidTetrahedron(GLdouble);

voidauxWireDodecahedron(GLdouble);

voidauxSolidDodecahedron(GLdouble);

voidauxWireCone(GLdouble,GLdouble);

voidauxSolidCone(GLdouble,GLdouble);

voidauxWireTeapot(GLdouble);

voidauxSolidTeapot(GLdouble);

想在程序中使用gl、glu或aux开头的OpenGL库函数时,必须包含对应的头文件:

#include<

gl/gl.h>

gl/glu.h>

gl/glaux.h>

并在项目设置中添加对应的库文件:

VC6.0:

选Project/Settings菜单,在弹出的ProjectSettings对话框中选Link页,在中间的Object/LibraryModulas域中添加opengl32.libglu32.libglaux.lib;

VC.NET和VC2005/2008:

在项目区中任何页中选中顶部的项目名,选“项目\属性”菜单项或按Alt+F7组合键,弹出“[项目名]属性页”对话框,在其左边的“配置”目录栏中,选中“配置属性\链接器\输入”项,(在该其左上角的“配置”栏的下拉式列表中,选择“所有配置”项)在右边顶行的“附加依赖项”栏中键入opengl32.libglu32.libglaux.lib,按“确定”钮关闭该对话框,但是,在VC2008所带的WindowsSDKv6.0A中,缺少glaux.h和glaux.lib文件。

数据类型与函数命名

数据类型

为了独立于计算机平台,OpenGL有各种自定义的基本数据类型,参见表5-3。

其中,最常用的是GLfloat和HGLRC。

为了使你的OpenGL程序具有可移植性,在程序中应该尽量使用这些数据类型。

函数命名

OpenGL的库函数的名称一般为:

库类型+功能名(+参数数目+参数类型[+向量符])

例如:

glColor3ub//核心库的颜色定义函数,参数为三个无符号字节数

glVertex3fv//核心库的顶点定义函数,参数为浮点数数组(三个一组)

gluLookAt//工具库的设置观察点函数(参数为9个双精度浮点数)

wglMakeCurrent//Windows扩展库的产生当前渲染描述表函数(两个参数:

HDC和HGLRC)

auxInitWindow//辅助库的初始化窗口函数

渲染范围

OpenGL通过用函数glBegin和glEnd:

voidglBegin(GLenummode);

voidglEnd(void);

把一组操作括起来(似C/C++的“{”和“}”)的方法,来管理图形。

其中glBegin函数的输入参数mode(图元类型)的取值可以为:

GL_POINTS(点)、GL_LINES(线)、GL_LINE_STRIP(线带)、GL_LINE_LOOP(线环)、GL_TRIANGLES(三角形)、GL_TRIANGLE_STRIP(三角形带)、GL_TRIANGLE_FAN(三角形扇)、GL_QUADS(四边形)、GL_QUAD_STRIP(四边形带)、GL_POLYGON(多边形)。

例如,画一个二维的正方形:

voidDrawGLSquare()

{

//X-Y平面中的正方形

glBegin(GL_LINES);

//逆时针画边线框,图元为直线

//画左边线

glVertex3f(-1.0f,1.0f,0.0f);

//似MoveTo

glVertex3f(-1.0f,-1.0f,0.0f);

//似LineTo

//画下边线

glVertex3f(1.0f,-1.0f,0.0f);

//画右边线

glVertex3f(1.0f,1.0f,0.0f);

//画上边线

 

glEnd();

}

矩阵栈

在OpenGL中使用矩阵进行渲染三维场景所需要的数据计算。

为简化操作,OpenGL提供一个矩阵栈,每次用栈顶的矩阵对给定的物体或场景进行渲染。

可用glPushMatrix和glPopMatrix函数来将矩阵压栈和出栈,还可以用glScalef和glRotatef等函数对栈顶的矩阵进行缩放和旋转等修改。

glLoadIdentity();

//设置当前矩阵为单位矩阵(无缩放和旋转)

glColor3f(1.0f,0.0f,0.0f);

//设置绘图颜色为红色

DrawGLSquare();

//画正方形

//glPushMatrix()把当前的矩阵拷贝到栈中.当调用glPopMatrix时,最后压入栈的矩阵恢 

//复为当前矩阵.

glPushMatrix();

glScalef(2.0f,0.5f,0.0f);

//x方向的尺寸放大一倍,y方向的尺寸缩小一半

glColor3f(0.0f,1.0f,0.0f);

//设置绘图颜色为绿色

//画扁矩形

glPopMatrix();

glRotatef(45.0f,0.0f,0.0f,1.0f);

//沿z轴旋转45度

glColor3f(0.0f,0.0f,1.0f);

//设置绘图颜色为蓝色

//画菱形

glScalef(0.5f,0.5f,0.0f);

//x方向与y方向的尺寸都缩小一半

glColor3f(1.0f,1.0f,0.0f);

//设置绘图颜色为黄色

//画小菱形

渲染环境

OpenGL命令

当前OpenGL渲染环境RC

Windows设备环境DC

OpenGL应用程序

图5-12 

正方形及其矩阵变换

Windows应用程序使用设备环境(DC=DeviceContext)来进行图形输出,WindowsGDI管理DC,并提供所需的各种设置与绘图函数(在MFC中封装到了CDC类内)。

但是为了跨平台和通用,OpenGL却不使用标准的WindowsDC,而是使用一种渲染环境(RC=RenderingContext)来绘图。

但是,在Windows平台中,RC的绘图并不能直接输出到显示和打印设备上,最终还是需要通过DC来具体实现。

参见图5-13。

图5-13 

DC与RC的关系

与DC相似,RC也用于保存在给定窗口中渲染一个场景所需的各种绘图信息。

一个RC可同时供多个线程使用,但是在同一时刻,一个线程只能有一个RC。

但与DC不同的是,OpenGL并不需要句柄或指向RC的指针,因为一个线程只能有一个RC。

所以,RC是隐含在绘图命令的调用中的。

所有的OpenGL绘图命令,都由当前RC来透明地接受和处理。

为了使OpenGL能在Windows中工作,必须有一种将RC与DC联系起来的机制,这需要使用Windows扩展库中的若干函数,例如:

HGLRCwglCreateContext(HDC);

//生成RC

BOOLwglDeleteContext(HGLRC);

//删除RC

BOOLwglMakeCurrent(HDC,HGLRC);

//激活RC

因为OpenGL与Windows在像素格式方面可能不一致,所以在初始化时,必须有一个协商过程,协商的结果就是RC。

这一协商过程需要几个GDI函数来处理,而它们都需要如下的一种复杂像素格式描述符结构:

typedefstructtagPIXELFORMATDESCRIPTOR{//pfd 

WORD 

nSize;

//结构大小

nVersion;

//版本

DWORDdwFlags;

//标志

BYTE 

iPixelType;

//像素类型=PFD_TYPE_RGBA

//或PFD_TYPE_COLORINDEX

cColorBits;

//颜色位数

cRedBits;

//红色位数

cRedShift;

//红色偏移

cGreenBits;

//绿色位数

cGreenShift;

//绿色偏移

BYTE 

cBlueBits;

//蓝色位数

cBlueShift;

//蓝色偏移

cAlphaBits;

//α值位数

cAlphaShift;

//α值偏移

cAccumBits;

//光栅缓存位数

cAccumRedBits;

//光栅缓存红色位数

cAccumGreenBits;

//光栅缓存绿色位数

cAccumBlueBits;

//光栅缓存蓝色位数

cAccumAlphaBits;

//光栅缓存α值位数

cDepthBits;

//深度缓存位数

cStencilBits;

//图案缓存位数

cAuxBuffers;

//辅助缓存位数

iLayerType;

//层类型(现已不使用)

bReserved;

//保留(设定覆盖和铺垫的位面数)

DWORDdwLayerMask;

//层掩模(现已不使用)

DWORDdwVisibleMask;

//可视掩模(透明的颜色)

DWORDdwDamageMask;

//损伤掩模(现已不使用)

}PIXELFORMATDESCRIPTOR;

其中标志dwFlags的常用可取值有:

PFD_DRAW_TO_WINDOW

PFD_DRAW_TO_BITMAP

PFD_SUPPORT_GDI

PFD_SUPPORT_OPENGL

PFD_DOUBLEBUFFER

PFD_SWAP_LAYER_BUFFERS

PIXELFORMATDESCRIPTORpfd={

sizeof(PIXELFORMATDESCRIPTOR),//结构大小

1,//版本号

PFD_DRAW_TO_WINDOW//标志(在窗口中绘图、支持OpenGL、

|PFD_SUPPORT_OPENGL|PFD_DOUBLEBUFFER,//采用双缓冲机制)

PFD_TYPE_RGBA,//像素类型

24,//24b颜色

0,0,0,0,0,0,//颜色位数与偏移

0,0,//α值位数与偏移

0,0,0,0,0,//光栅缓存位数

32,//32b深度缓存

0,0,//无图案缓存和辅助缓存

0,//层类型(现已不使用)

0,//保留

0,0,0//不支持掩模

};

m_hDC=GetDC()->

GetSafeHdc();

//获取DC句柄

intnPixelFormat=ChoosePixelFormat(m_hDC,&

pfd);

//在DC支持的像素格式中

//选择与pfd最匹配的像素格式

SetPixelFormat(m_hDC,nPixelFormat,&

//设置DC的像素格式

m_hRC=wglCreateContext(m_hDC);

//创建一个与DC匹配的RC

wglMakeCurrent(m_hDC,m_hRC);

//设置调用线程的当前RC为m_hRC

//将m_hRC与m_hDC关联在一起

简单例子

为了说明如何用VC开发OpenGL程序,我们看一个简单的例子:

建立一个SDI的MFC项目GL

在项目设置中添加对应的库文件:

opengl32.libglu32.libglaux.lib

在视图类CGLView中包含OpenGL的头文件:

在视图类CGLView中定义类变量:

HGLRCm_hRC;

HDCm_hDC;

在视图类CGLView的PreCreateWindow函数中修改窗口的创建结构,以剪掉子窗口和兄弟窗口:

(这是OpenGL所要求的)

BOOLCGLView:

:

PreCreateWindow(CREATESTRUCT&

cs){

cs.style|=WS_CLIPSIBLINGS|WS_CLIPCHILDREN;

returnCView:

PreCreateWindow(cs);

在视图类CGLView中添加WM_CREATE的消息响应函数OnCreate,在该函数中初始化OpenGL:

intCGLView:

OnCreate(LPCREATESTRUCTlpCreateStruct){

if(CView:

OnCreate(lpCreateStruct)==-1)return-1;

//TODO:

Addyourspecializedcreationcodehere

PIXELFORMATDESCRIPTORpfd={

sizeof(PIXELFORMATDESCRIPTOR),

1,

PFD_DRAW_TO_WINDOW|PFD_SUPPORT_OPENGL|

PFD_DOUBLEBUFFER,

PFD_TYPE_RGBA,

24,

0,0,0,0,0,0,

0,0,

0,0,0,0,0,

32,

0,

0,0,0

};

m_hDC=GetDC()->

intnPixelFormat=ChoosePixelFormat(m_hDC,&

SetPixelFormat(m_hDC,nPixelFormat,&

m_hRC=wglCreateContext(m_hDC);

wglMakeCurrent(m_hDC,m_hRC);

glClearColor(0.0f,0.0f,0.0f,0.0f);

//设置背景为黑色

return0;

为了避免内存泄漏,在应用程序退出时,必须删除所创建的RC。

这需要为视图类添加WM_DESTROY的消息响应函数OnDestroy:

voidCGLView:

OnDestroy(){

CView:

OnDestroy();

wglMakeCurrent(NULL,NULL);

//选出RC

wglDeleteContext(m_hRC);

为了使RC适应用户对窗口大小的调整,必须为视图类添加WM_SIZE的消息响应函数OnSize。

可在此函数中重置映射和模型矩阵、重建观察窗口和视锥:

OnSize(UINTnType,intcx,intcy){

OnSize(nType,cx,cy);

glViewport(0,0,cx,cy);

//设置视口范围(有变形)

//glViewport(0,0,min(cx,cy),min(cx,cy));

//设置视口范围为cx与cy的最小值

glMatrixMode(GL_PROJECTION);

//设置投影矩阵

//装入单位矩阵

gluPerspective(30,1,-3

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

当前位置:首页 > 医药卫生 > 基础医学

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2