OpenGL最好的入门和提高教材Word文档格式.docx
- 文档编号:5746378
- 上传时间:2023-05-05
- 格式:DOCX
- 页数:14
- 大小:21.05KB
OpenGL最好的入门和提高教材Word文档格式.docx
《OpenGL最好的入门和提高教材Word文档格式.docx》由会员分享,可在线阅读,更多相关《OpenGL最好的入门和提高教材Word文档格式.docx(14页珍藏版)》请在冰点文库上搜索。
提供最基本的绘图函数
工具库
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文件。
数据类型与函数命名
l
数据类型
为了独立于计算机平台,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
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- OpenGL 最好 入门 提高 教材