免费预览已结束,剩余26页可下载查看
下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
VC+游戏编程,第五章OpedGL游戏编程技术,VC+游戏编程OpenGL,OpenGL开放性图形库SGI1992年发布OpenGL1.0版特点:图像质量好,性能高;工业标准;稳定性;可移植性和可靠性;可扩展性;可缩放性;易用性;不足:1.与窗口系统无关,不提供任何交互手段,要有程序员自己编写所有的交互功能;2.OpenGLAPI是低级的C函数,不提供可重用的对象库或者应用程序框架。,VC+游戏编程OpenGL,OpenGL是一个“纯粹”的图形API,不包含窗口创建、管理等功能的实现,也没有和键盘、鼠标等设备进行交互处理的接口。屏幕和窗口由宿主环境操纵。为方便两者之间的关联,没中环境通常都有一些“粘贴”到OpenGL上的扩展接口,提供窗口管理和用户交互功能。这种“粘贴”就是把OpenGL图形处理命令关联到一个特定平台上的图形窗口。这种环境还提供一些函数,用于设置缓冲区模式、颜色深度以及其他绘图功能。对于Windows平台,这种粘贴代码包含在一组被称作“Wiggel”的函数中。它们是对WindowsAPI的一种补充,它们的前缀是wgl而不是gl。,VC+游戏编程OpenGL,OpenGL的库函数采用C语言风格,提供大量的函数来进行图形的处理和显示。OpenGL库函数的命名方式非常有规律。所有OpenGL函数采用了以下格式:库前缀有gl、glu、aux、glut、wgl、glx、agl等等,分别表示该函数属于OpenGL那个开发库,从函数名后面中还可以看出需要多少个参数以及参数的类型。I代表int型,f代表float型,d代表double型,u代表无符号整型。例如glVertex3fv()表示了该函数属于gl库,参数是三个float型参数指针。我们用glVertex*()来表示这一类函数。,VC+游戏编程OpenGL,OpenGL函数库相关的API有核心库(gl)、实用库(glu)、辅助库(aux)、实用工具库(glut)、窗口库(glx、agl、wgl)和扩展函数库等。从图可以看出,gl是核心,glu是对gl的部分封装。glx、agl、wgl是针对不同窗口系统的函数。glut是为跨平台的OpenGL程序的工具包,比aux功能强大。扩展函数库是硬件厂商为实现硬件更新利用OpenGL的扩展机制开发的函数。,VC+游戏编程OpenGL,如果不使用OpenGL,在Windows中绘图一般要借助GDI(图形设备接口)来完成。每个窗口都有一个设备环境,勇于接收实际图形输出,每个GDI函数都接受一个设备环境作为参数,它决定这个函数的操作将影响那个窗口,可以使用多个设备环境,但一个窗口只能用一个。OpenGL也有一种设备环境标示符,叫渲染环境(renderingcontext)。OpenGL渲染环境是OpenGL在其中存储状态信息的数据结构,渲染图像的时候要用到这些信息。它们包括纹理、服务器端的缓存对象、函数入口点、混合状态以及编译过的渲染器对象。调用wglCreateContext函数创建一个OpenGL渲染环境HGLDChRC;/声明OpenGL渲染环境句柄HDChDC;/声明窗口设备环境句柄hRC=wglCreateContext(hDC),VC+游戏编程OpenGL,创建窗口(Win32SDK风格/面向对象风格的窗口框架)#include“windows.h“/包含头文件#include/包含OpenGL头文件#include#include#pragmacomment(lib,opengl32.lib)/*包含OpenGL链接库文件*/#pragmacomment(lib,glu32.lib)#pragmacomment(lib,glaux.lib),vc环境下OpenGL编程:Win32应用编程,VC+游戏编程OpenGL,程序主进程:WinMain,创建窗口CreateGLWindow,进入主窗口消息循环,退出,VC环境下OpenGL编程:Win32应用编程一、程序主流程,VC+游戏编程OpenGL,程序主进程:WinMain,创建窗口CreateGLWindow,进入主窗口消息循环,退出,注册窗口类:RegisterClass,显示设置:ChangeDisplaySettings,调整窗口大小:AdjustWindowRectEx,创建:CreateWindowEx,选择像素格式:ChoosePixelFormat,设置像素格式:SetPixelFormat,创建OpenGL渲染上下文:wglCreateContext,激活OpenGL渲染上下文:wglMakeCurrent,显示窗口:ShowWindow,调整OpenGL视口大小:ReSizeGLScene,OpenGL绘制选项初始化:InitGL,二、OpenGL窗口创建及初始化,HDChDC=NULL;/基本图形设备接口上下文,选择和设置像素格式时使用HGLRChRC=NULL;/永久渲染上下文,创建和激活OpenGL渲染上下文时使用HWNDhWnd=NULL;/窗口句柄HINSTANCEhInstance;/应用实例句柄,VC+游戏编程OpenGL,VC+游戏编程OpenGL,三、调整OpenGL视口glViewport(0,0,width,height);/设置当前视口大小glMatrixMode(GL_PROJECTION);/选择投影矩阵模式glLoadIdentity();/重置投影矩阵,计算OpenGL观察窗口参数:视角、宽高比、近裁剪面、远裁剪面gluPerspective(45.0f,(GLfloat)width/(GLfloat)height,0.1f,100.0f);glMatrixMode(GL_MODELVIEW);/选择模型矩阵模式glLoadIdentity();/重置模型矩阵,四、OpenGL绘制选项初始化glShadeModel(GL_SMOOTH);/打开平滑阴影:glClearColor(0.0f,0.0f,0.0f,0.5f);/黑色背景glClearDepth(1.0f);/深度缓存初始化glEnable(GL_DEPTH_TEST);/打开深度测试glDepthFunc(GL_LEQUAL);/深度测试类型,GL_LEQUAL:当前深度值小于或等于深度缓存中的深度值时进行绘制glHint(GL_PERSPECTIVE_CORRECTION_HINT,GL_NICEST);/高质量投影计算,VC+游戏编程OpenGL,VC+游戏编程OpenGL,五、OpenGL图形绘制glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);/初始化颜色缓存和深度缓存glLoadIdentity();glTranslatef(-1.5f,0.0f,-6.0f);glRotatef(rtri,0.0f,1.0f,0.0f);glBegin(GL_TRIANGLES);/绘制四菱锥glColor3f(1.0f,0.0f,0.0f);glVertex3f(0.0f,1.0f,0.0f);glColor3f(0.0f,1.0f,0.0f);glVertex3f(-1.0f,-1.0f,1.0f);glColor3f(0.0f,0.0f,1.0f);glVertex3f(1.0f,-1.0f,1.0f);glColor3f(1.0f,0.0f,0.0f);glVertex3f(0.0f,1.0f,0.0f);glColor3f(0.0f,0.0f,1.0f);glVertex3f(1.0f,-1.0f,1.0f);glColor3f(0.0f,1.0f,0.0f);glVertex3f(1.0f,-1.0f,-1.0f);glColor3f(1.0f,0.0f,0.0f);glVertex3f(0.0f,1.0f,0.0f);glColor3f(0.0f,1.0f,0.0f);glVertex3f(1.0f,-1.0f,-1.0f);glColor3f(0.0f,0.0f,1.0f);glVertex3f(-1.0f,-1.0f,-1.0f);glColor3f(1.0f,0.0f,0.0f);glVertex3f(0.0f,1.0f,0.0f);glColor3f(0.0f,0.0f,1.0f);glVertex3f(-1.0f,-1.0f,-1.0f);glColor3f(0.0f,1.0f,0.0f);glVertex3f(-1.0f,-1.0f,1.0f);glEnd();,/绘制立方体glLoadIdentity();glTranslatef(1.5f,0.0f,-7.0f);glRotatef(rquad,1.0f,1.0f,1.0f);glBegin(GL_QUADS);glColor3f(0.0f,1.0f,0.0f);glVertex3f(1.0f,1.0f,-1.0f);glVertex3f(-1.0f,1.0f,-1.0f);glVertex3f(-1.0f,1.0f,1.0f);glVertex3f(1.0f,1.0f,1.0f);glColor3f(1.0f,0.5f,0.0f);glVertex3f(1.0f,-1.0f,1.0f);glVertex3f(-1.0f,-1.0f,1.0f);glVertex3f(-1.0f,-1.0f,-1.0f);glVertex3f(1.0f,-1.0f,-1.0f);glColor3f(1.0f,0.0f,0.0f);glVertex3f(1.0f,1.0f,1.0f);glVertex3f(-1.0f,1.0f,1.0f);glVertex3f(-1.0f,-1.0f,1.0f);glVertex3f(1.0f,-1.0f,1.0f);glColor3f(1.0f,1.0f,0.0f);glVertex3f(1.0f,-1.0f,-1.0f);glVertex3f(-1.0f,-1.0f,-1.0f);glVertex3f(-1.0f,1.0f,-1.0f);glVertex3f(1.0f,1.0f,-1.0f);glColor3f(0.0f,0.0f,1.0f);glVertex3f(-1.0f,1.0f,1.0f);glVertex3f(-1.0f,1.0f,-1.0f);glVertex3f(-1.0f,-1.0f,-1.0f);glVertex3f(-1.0f,-1.0f,1.0f);glColor3f(1.0f,0.0f,1.0f);glVertex3f(1.0f,1.0f,-1.0f);glVertex3f(1.0f,1.0f,1.0f);glVertex3f(1.0f,-1.0f,1.0f);glVertex3f(1.0f,-1.0f,-1.0f);glEnd();,/调整旋转角度rtri+=0.2f;rquad-=0.15f;returnTRUE;/绘制结束,六、主窗口消息循环,程序主进程:WinMain,创建窗口CreateGLWindow,进入主窗口消息循环,退出,主窗口消息处理,OpenGL场景绘制,切换缓存:SwapBuffers,VC+游戏编程OpenGL,#include“windows.h“/包含头文件#include/包含OpenGL头文件#include#include#pragmacomment(lib,opengl32.lib)/*包含OpenGL链接库文件*/#pragmacomment(lib,glu32.lib)#pragmacomment(lib,glaux.lib),VC+游戏编程OpenGL,OpenGL变换:视点变换:gluLookAt(),函数包括视点位置,参考点位置和向上向量的方向。模型变换:模型变换、模型旋转、模型缩放。glTranslate(TYPEx,TYPEy,TYPEz)glRotate(TYPEx,TYPEy,TYPEz)glScale(TYPEx,TYPEy,TYPEz)投影变换:正投影(平行投影)glOrtho,透视投影;glFrustm();gluPerspective();视口变换:glViewport();裁剪变换:glClipPlane();,VC+游戏编程OpenGL,OpenGL光照模型法向量:glNormal*();创建光源:glLight*();选择光照模型:全局环境光,局部视点和无穷远点,双面光照(正面和背面);glLightModeli();OpenGL材质:材质定义:glMateral();颜色材质模型:glColorMaterail();,VC+游戏编程OpenGL,OpenGL纹理映射:纹理位图载入:读入位图文件。纹理映射:定义纹理;控制纹理;设置映射方式;绘制场景。摄像漫游:当我们观察物体时,物体移动我们的眼睛也跟着移动,从而使周围的事物反映到大脑中,达到漫游效果。在视点函数gluLookAt()中,改变视点X分量就可以实现在场景中横向移动,同理改变Y,Z分量。,VC+游戏编程OpenGL,构造天空和地面一、天空构造3D场景中构造天空有多种方法:1.颜色绘制天空白云2.天空盒:放到场景的是一个立方体3.天空穹:放到头顶的是一个曲面,VC+游戏编程OpenGL,圆屋顶的天空模型是一个半球体,通过对半球体的内表面进行纹理贴图来表现天空环境。,VC+游戏编程OpenGL,VC+游戏编程OpenGL,二、纹理贴图通过纹理资源的载入、纹理映射和场景绘制实现纹理贴图。为了达到真实天空的效果,对构成天空的图片纹理进行一些特殊处理:1)上下左右4幅图片要首尾相接;2)顶面图片的纹理边缘要和前后左右4幅图片的上边纹理相连;3)地面图片的纹理边缘要和前后左右4幅图片的下边纹理相连;,VC+游戏编程OpenGL,三、漫游通过改变视点、摄像机(观察坐标系)在场景中的位置实现。viodgluLookAt(GLdoubleeyeX,GLdoubleeyeY,GLdoubleeyeZ,GLdoublecenterX,GLdoublecenterY,GLdoublecenterZ,GLdoubleupX,GLdoubleupY,GLdoubleupZ);(eyeX,eyeY,eyeZ)定义视点位置(centerX,centerY,centerZ)定义摄像机瞄准的参考点(upX,upY,upZ)定义摄像机向上的向量,通常为(0,1,0)改变视点X分量eyeX,实现在场景中做横向移动,同理改变eyeY,eyeZ,实现蹲下、跳
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026年杭州流金溢彩装饰有限公司介绍企业发展分析报告
- 医生或医技岗位招聘面试题及答案2025年
- 碳指数设计师高级考试通过率及备考经验
- 2025陕西法士特齿轮有限责任公司招聘笔试历年典型考点题库附带答案详解试卷2套
- 2025贵州遵义红城环卫能源有限公司招聘专业技术人员5人笔试历年常考点试题专练附带答案详解试卷2套
- 2025福建泉州晋江国际机场股份有限公司及权属公司公开招聘140人笔试历年难易错考点试卷带答案解析试卷2套
- 文秘工作日常计划与任务管理
- 长期照护服务体系等级划分建议
- 2025浙江宁波市轨道交通集团有限公司运营分公司招聘75人笔试历年典型考点题库附带答案详解试卷2套
- 提升国内电商店铺DSR评分与客户满意度的运营计划
- 2025年甘肃省兰州市中考英语试卷(含答案)
- 2025消化内镜室护士护理应知应会考核试题及答案
- 牙科种植与修复病例的多学科联合治疗
- 2025年党纪学习教育应知应会100条(含答案)【收藏学习】
- 冠心病防治科普知识
- 建筑工程企业管理案例
- 师承确有专长考试中药学功效表格记忆
- Unit1YouandMe单元知识清单-人教版七年级英语上册
- 2025年图书管理员职称考试试题及答案
- 初中物理作业设计与命题培训
- 大型商场施工安全管理措施
评论
0/150
提交评论