ImageVerifierCode 换一换
格式:DOCX , 页数:14 ,大小:21.05KB ,
资源ID:5746378      下载积分:2 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bingdoc.com/d-5746378.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(OpenGL最好的入门和提高教材Word文档格式.docx)为本站会员(b****1)主动上传,冰点文库仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰点文库(发送邮件至service@bingdoc.com或直接QQ联系客服),我们立即给予删除!

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

1、提供最基本的绘图函数工具库glu32.libgl/glu.hglu设置观察角度和投影矩阵、处理纹理图像、进行坐标变换、镶嵌多边形、绘制曲面、出错处理扩展Windowswingdi.hwgl将OpenGL与Windows的窗口系统联系起来,管理绘图描述表、显示列表、执行函数和字体位图,支持窗口的像素格式和双缓冲机制辅助库glaux.libgl/glaux.haux管理窗口、处理输入事件、载入颜色映射、绘制三维物体、指定空闲/重绘函数Unix平台 Windows平台其中:GLU = OpenGL Utility Library,GLX = Graphics Library of X window

2、systemGDU = Graphics Device Utility,WGL = Windows Graphics Library下面是Windows平台辅助库中的若干三维物体绘制函数:void auxWireSphere(GLdouble);void auxSolidSphere(GLdouble);void auxWireCube(GLdouble);void auxSolidCube(GLdouble);void auxWireBox(GLdouble, GLdouble, GLdouble);void auxSolidBox(GLdouble, GLdouble, GLdouble)

3、;void auxWireTorus(GLdouble, GLdouble);void auxSolidTorus(GLdouble, GLdouble);void auxWireCylinder(GLdouble, GLdouble);void auxSolidCylinder(GLdouble, GLdouble);void auxWireIcosahedron(GLdouble);void auxSolidIcosahedron(GLdouble);void auxWireOctahedron(GLdouble);void auxSolidOctahedron(GLdouble);voi

4、d auxWireTetrahedron(GLdouble);void auxSolidTetrahedron(GLdouble);void auxWireDodecahedron(GLdouble);void auxSolidDodecahedron(GLdouble);void auxWireCone(GLdouble, GLdouble);void auxSolidCone(GLdouble, GLdouble);void auxWireTeapot(GLdouble);void auxSolidTeapot(GLdouble);想在程序中使用gl、glu或aux开头的OpenGL库函数

5、时,必须包含对应的头文件:#include gl/glu.hgl/glaux.h并在项目设置中添加对应的库文件: VC 6.0:选Project/Settings菜单,在弹出的Project Settings对话框中选Link页,在中间的Object/Library Modulas域中添加opengl32.lib glu32.lib glaux.lib; VC .NET和VC 2005/2008:在项目区中任何页中选中顶部的项目名,选“项目属性”菜单项或按Alt+F7组合键,弹出“项目名属性页”对话框,在其左边的“配置”目录栏中,选中“配置属性链接器输入”项,(在该其左上角的“配置”栏的下拉式

6、列表中,选择“所有配置”项)在右边顶行的“附加依赖项”栏中键入opengl32.lib glu32.lib glaux.lib,按“确定”钮关闭该对话框,但是,在VC 2008所带的Windows SDK v6.0A中,缺少glaux.h和glaux.lib文件。数据类型与函数命名l 数据类型为了独立于计算机平台,OpenGL有各种自定义的基本数据类型,参见表5-3。其中,最常用的是GLfloat和HGLRC。为了使你的OpenGL程序具有可移植性,在程序中应该尽量使用这些数据类型。 函数命名OpenGL的库函数的名称一般为:库类型 + 功能名 (+ 参数数目 + 参数类型 + 向量符)例如:

7、glColor3ub / 核心库的颜色定义函数,参数为三个无符号字节数glVertex3fv / 核心库的顶点定义函数,参数为浮点数数组(三个一组)gluLookAt / 工具库的设置观察点函数(参数为9个双精度浮点数)wglMakeCurrent / Windows扩展库的产生当前渲染描述表函数(两个参数:HDC和HGLRC)auxInitWindow / 辅助库的初始化窗口函数渲染范围OpenGL通过用函数glBegin和glEnd:void glBegin ( GLenum mode );void glEnd ( void );把一组操作括起来(似C/C+的“”和“”)的方法,来管理图形

8、。其中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(多边形)。例如,画一个二维的正方形:void DrawGLSquare()/ X-Y平面中的正方形 glBegin(GL_LINES); / 逆时针画边线框,图元为直线 / 画左边线 glVe

9、rtex3f(-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和glRota

10、tef等函数对栈顶的矩阵进行缩放和旋转等修改。 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); / 设置绘图颜色为绿色 /

11、 画扁矩形 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渲染环境RCWindows设备环境DCOpenGL应用程序图5-12 正方形及其矩阵变换Windows应用程序使用设备环境(DC = Device

12、 Context)来进行图形输出,Windows GDI管理DC,并提供所需的各种设置与绘图函数(在MFC中封装到了CDC类内)。但是为了跨平台和通用,OpenGL却不使用标准的Windows DC,而是使用一种渲染环境(RC = Rendering Context)来绘图。但是,在Windows 平台中,RC的绘图并不能直接输出到显示和打印设备上,最终还是需要通过DC来具体实现。参见图5-13。 图5-13 DC与RC的关系与DC相似,RC也用于保存在给定窗口中渲染一个场景所需的各种绘图信息。一个RC可同时供多个线程使用,但是在同一时刻,一个线程只能有一个RC。但与DC不同的是,OpenGL

13、并不需要句柄或指向RC的指针,因为一个线程只能有一个RC。所以,RC是隐含在绘图命令的调用中的。所有的OpenGL绘图命令,都由当前RC来透明地接受和处理。为了使OpenGL能在Windows中工作,必须有一种将RC与DC联系起来的机制,这需要使用Windows扩展库中的若干函数,例如:HGLRC wglCreateContext(HDC); / 生成RCBOOL wglDeleteContext(HGLRC); / 删除RCBOOL wglMakeCurrent(HDC, HGLRC); / 激活RC因为OpenGL与Windows在像素格式方面可能不一致,所以在初始化时,必须有一个协商过程

14、,协商的结果就是RC。这一协商过程需要几个GDI函数来处理,而它们都需要如下的一种复杂像素格式描述符结构:typedef struct tagPIXELFORMATDESCRIPTOR / pfd WORD nSize; / 结构大小 nVersion; / 版本 DWORD dwFlags; / 标志 BYTE iPixelType; / 像素类型= PFD_TYPE_RGBA / 或PFD_TYPE_COLORINDEX cColorBits; / 颜色位数 cRedBits; / 红色位数 cRedShift; / 红色偏移 cGreenBits; / 绿色位数 cGreenShift;

15、 / 绿色偏移BYTE cBlueBits; / 蓝色位数 cBlueShift; / 蓝色偏移 cAlphaBits; / 值位数 cAlphaShift; / 值偏移 cAccumBits; / 光栅缓存位数 cAccumRedBits; / 光栅缓存红色位数 cAccumGreenBits; / 光栅缓存绿色位数 cAccumBlueBits; / 光栅缓存蓝色位数 cAccumAlphaBits; / 光栅缓存值位数 cDepthBits; / 深度缓存位数 cStencilBits; / 图案缓存位数 cAuxBuffers; / 辅助缓存位数 iLayerType; / 层类型(现

16、已不使用) bReserved; / 保留(设定覆盖和铺垫的位面数) DWORD dwLayerMask; / 层掩模(现已不使用) DWORD dwVisibleMask; / 可视掩模(透明的颜色) DWORD dwDamageMask; / 损伤掩模(现已不使用) PIXELFORMATDESCRIPTOR;其中标志dwFlags的常用可取值有:PFD_DRAW_TO_WINDOWPFD_DRAW_TO_BITMAPPFD_SUPPORT_GDIPFD_SUPPORT_OPENGLPFD_DOUBLEBUFFERPFD_SWAP_LAYER_BUFFERSPIXELFORMATDESCR

17、IPTOR pfd = 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, / 层类型(现已不使用)

18、 0, / 保留 0, 0, 0 / 不支持掩模;m_hDC = GetDC()-GetSafeHdc(); / 获取DC句柄int nPixelFormat = ChoosePixelFormat(m_hDC, &pfd); / 在DC支持的像素格式中 / 选择与pfd最匹配的像素格式SetPixelFormat(m_hDC, nPixelFormat, & / 设置DC的像素格式m_hRC = wglCreateContext(m_hDC); / 创建一个与DC匹配的RCwglMakeCurrent(m_hDC, m_hRC); / 设置调用线程的当前RC为m_hRC / 将m_hRC与m

19、_hDC关联在一起简单例子为了说明如何用VC开发OpenGL程序,我们看一个简单的例子: 建立一个SDI的MFC项目GL 在项目设置中添加对应的库文件:opengl32.lib glu32.lib glaux.lib 在视图类CGLView中包含OpenGL的头文件: 在视图类CGLView中定义类变量:HGLRC m_hRC;HDC m_hDC; 在视图类CGLView的PreCreateWindow函数中修改窗口的创建结构,以剪掉子窗口和兄弟窗口:(这是OpenGL所要求的)BOOL CGLView:PreCreateWindow(CREATESTRUCT& cs) cs.style |=

20、 WS_CLIPSIBLINGS | WS_CLIPCHILDREN; return CView:PreCreateWindow(cs); 在视图类CGLView中添加WM_CREATE的消息响应函数OnCreate,在该函数中初始化OpenGL:int CGLView:OnCreate(LPCREATESTRUCT lpCreateStruct) if (CView:OnCreate(lpCreateStruct) = -1) return -1; / TODO: Add your specialized creation code here PIXELFORMATDESCRIPTOR pf

21、d = 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()- int nPixelFormat = ChoosePixelFormat(m_hDC, & SetPixelFormat(m_hDC, nPixelFormat, & m_hRC = wglCreateContext(m

22、_hDC); wglMakeCurrent(m_hDC, m_hRC); glClearColor(0.0f, 0.0f, 0.0f, 0.0f); / 设置背景为黑色 return 0; 为了避免内存泄漏,在应用程序退出时,必须删除所创建的RC。这需要为视图类添加WM_DESTROY的消息响应函数OnDestroy:void CGLView:OnDestroy() CView:OnDestroy(); wglMakeCurrent(NULL, NULL); / 选出RC wglDeleteContext(m_hRC); 为了使RC适应用户对窗口大小的调整,必须为视图类添加WM_SIZE的消息响应函数OnSize。可在此函数中重置映射和模型矩阵、重建观察窗口和视锥:OnSize(UINT nType, int cx, int cy) 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