用OpenGL开发三维交互式虚拟场景
第8期谢志鹏等:用OpenGL开发三维交互式虚拟场景 39
接着被OpenGL安装型客户驱动程序解释,随后送入
服务器的动态链接库WINSRV.DLL进一步处理,紧接着传递给设备驱动接口Win32DDI(DeviceDriverInterface),最后由视频显示驱动程序处理,该驱动程序把复杂的OpenGL指令运算(如纹理映射、透视校正、三线性过滤)指派给显示卡的OpenGL图形加速处理器,从而制造出逼真的三维场景,图2显示了这
一过程。
图2
3 MFC环境下三维场景的开发
作者在用VisualC++设计一个模拟3D射击游戏的分段开发过程中,构造了OpenGL专用视图类,用它来初始化OpenGL工作环境并正确设置调色板。此外为了进行纹理贴图和画面输出保存。构造了一个设备无关位图类,下面分别介绍如何构造这两个类。
1)构造OpenGL初始化视图类
在MFC中使用OpenGL必须进行一系列初始化设置及程序结束处理工作、因此可构造一个可继承的视图类,以方便后继开发调试任务。该视图类完成以下任务。
响应WM CREATE消息,获取设备描述表(DC)、设置象素格式,检测用户当前的显示环境,若其颜色深度为16色或256色模式则创建逻辑调色板并激活它,以使显示正常。紧接着创建着色描述表(RC),并使之当前化。
响应WM SIZE、WM ERASEBKGND消息,在OnSize函数中建立视点、启动透视变换并建立视景体、重载OnEraseBkgnd函数,使它返回真值,以消除重绘画面引起的黑色闪烁。
响应WM DESTROY消息,释放RC和DC。 检查并设置象素格式和调色板。
OpenGL应用程序中无论输入何种数据,最终进行的是象素操作,即把象素写入帧缓存,帧缓存包括颜色缓存(Colorbuffer)、深度缓存(Zbuffer)、模板缓存(Stencilbuffer)和累积缓存(Accumulationbuffer),颜色缓存包含象素点的颜色信息。深度缓存包含象素点的深度数据,模板缓存包含象素的模板值,可用来屏蔽屏幕特定区域和制作物体的相交部份。累积缓存则把多次绘制的景物(每次绘制前均作轻微抖动)进行融合以后输出到颜色缓存中,以此实现景深模拟和运动模糊。
在MSWindows环境下,数据结构PIXELFORMATDESCRIPTOR用来设置象素属性,其成员值表示了上述的一系列属性。在三维实时交互式动画中,成员dwFlags应设置PFD DOUBLEBUFFER双缓存模式,另外若要输出某帧画面,则须添加上PFDDRAWTOBITMAP以支持位图文件的输出生真模式,引模式则会降低画面质量。至于深度缓存的设置必须依赖于OpenGL图形加速卡的硬件能力 ZbufferBits。设置象素格式可在OnCreate函数中运行,用一个循环来对设备描述表支持的各种象素格式进行测试,发现适合期望目标的就设置它。
紧接着自动判断用户系统显示环境的颜色深度设置,若小于或低于8bit则应创建一个逻辑调色板并激活它,否则该程序在颜色深度小于或低于8bit的环境下无法正常显示。随后创建RC获取窗口客户区大小,清除深度缓存、启动深度测试及OpenGL模型变换。
2)构造用于纹理贴图和输出画面的设备无关位图类
纹理贴图作为材质制作的高级技术,在虚拟场景中得到广泛应用。OpenGL提供了相应的纹理映射函数,以把一组连续的象素点颜色值映射到几何形体表面。所以为进行真实感纹理贴图,应制作设备无关位图类,以便将位图文件读入内存并放入一维连续字节数组才可让OpenGL纹理映射函数调用。
位图文件由文件头(BITMAPFILEHEADER),位图信息结构(BITMAPINFO)和象素值序列组成,对于颜色深度在8bit以上的位图文件,其位图信息结构只包括位图信息头,其象素值就是RGB颜色序列。对于8bit以下位图文件,其位图结构包括位图信息头(BITMAPINFOHEADER)和调色板,象素值则为颜色索引值。调色板是RGBQUAD类型的结构数组。颜色索引值则代表调色板中相应序号的RGBQUAD结构,也就是一组RGB颜色值。
该位图类的读文件函数能自动判断位图文件的颜色深度信息,若是24bit则象素数据指针直接定位在BITMAPINFOHEADER之后,若为1,4或8bit,则根据BITMAPINFOHEADER中的成员biClrUsed来判断其调色板究竟有多少个RGBAQUAD结构组成,若biClrUsed=0则表示使用最大调色板条目分别为2,16和256。若biClrUsed!0,则其值即等于RGBAQUAD结构的数目,由此可知,象素数据指针应定位在BITMAPINFOHEADER+SizeOf(RGBQUAD)*NumberOf(RGBQUAD)之后。任何颜色深度的位图在象素数据阵列中其单个象素点均占据与其颜色深度相同的位数(这里只考虑目前大量使用的非压缩列读数
…… 此处隐藏:59字,全部文档内容请下载后查看。喜欢就下载吧 ……