基于 FBO 和 GPU 的动态 CEM 算法及实现.doc

上传人:李主任 文档编号:3625097 上传时间:2019-09-18 格式:DOC 页数:4 大小:347.50KB
返回 下载 相关 举报
基于 FBO 和 GPU 的动态 CEM 算法及实现.doc_第1页
第1页 / 共4页
基于 FBO 和 GPU 的动态 CEM 算法及实现.doc_第2页
第2页 / 共4页
基于 FBO 和 GPU 的动态 CEM 算法及实现.doc_第3页
第3页 / 共4页
基于 FBO 和 GPU 的动态 CEM 算法及实现.doc_第4页
第4页 / 共4页
亲,该文档总共4页,全部预览完了,如果喜欢就下载吧!
资源描述

《基于 FBO 和 GPU 的动态 CEM 算法及实现.doc》由会员分享,可在线阅读,更多相关《基于 FBO 和 GPU 的动态 CEM 算法及实现.doc(4页珍藏版)》请在三一文库上搜索。

1、精品论文http:/基于 FBO 和 GPU 的动态 CEM 算法及实现高光磊第 陈炳发1.南京航空航天大学机电学院 江苏南京 210016摘 要 改进了 OPENGL 中动态立方体环境映射的实现方法,新方法利用 FBO 使环境图像直接渲染 到立方体纹理,利用 GPU 编程语言 GLSL 进行逐像素纹理和光照计算,与传统方法相比,该方法提高了帧 率和图象质量。最后给出了该方法实现过程。关键词 OPENGL FBO 动态 立方体环境映射 CubeMap GPU中图分类号 TP317.4文献标示码:AA Method of Dynamic CEM Based on FBO&GPUGAO Guang

2、-lei1 CHEN Bing fa11 Nanjing University of Aeronautics and Astronautics, Jiangsu Nanjing, 210016, ChinaAbstract A new method of OPENGL CEM is introduced, which render into CubeMap texture directly using FBO, and computer per pixel texture coordinate and lighting using GPU programming language GLSL.

3、Compared with tradition, this method increase display velocity and achieve good image quality. The realization of this method is given.Key words OPENGL FBO Dynamic CEM CubeMap GPU41 引言当今游戏大量使用动态环境映射技术,以加强真实感显 示。通常采 用的动态环 境映射技术 是动态 CEM ( Cube Environment Mapping,立方体环境映射)技术,可以实时地生成 水、金属、玻璃等物体的反射和折射效果。

4、 因此,动态 CEM 技术具有很强的应用和研究价值。图 1 传统的渲染到纹理的方法动态 CEM 包括两个过程:实时生成 CubeMap 和用 CubeMap 绘制物体。.生成 CubeMap 需要六次渲染纹理操作。 OPENGL 中渲染到纹理传统的方法是调用 glCopyTexImage2D() 和 glCopyTexSubImage2D()函数。但窗口的大小限制了纹理的使 用大小,并且纹理的大小必须是 2 的幂。为解决这个限制, PBuffers 很快成为渲染到纹理的标准方法。Pbuffers 允许离屏渲 染,并独立于帧缓存。但和前者有个相同的缺陷:需要从 Pbuffers 到纹理的复制过程

5、,如图 1 所示.为解决这个问题,出现了 WGL_ARB_render_texture 扩展,它允许 PBuffers 直接 绑定纹理,避免了复制过程。然而该方法并没流行。首先, PBuffers 需要独立 GL 上下文,操作烦琐,上下文切换操作 耗费资源;其次,PBuffers 拥有独立的颜色缓存、深度缓存、 模板缓存,且不能被共享,这就占用了昂贵了存储空间;最后, 该扩展是基于 Windows 系统的。综上因素限制了其使用范围。传统使用 CubeMap 渲染物体的方法是采用固定渲染管道,该方法采用顶点纹理坐标生成和顶点光照计算,并且不能 计算折射,所以生成真实感图形的效果有限。2 动态 C

6、EM 理论及算法2.1 使用 FBO(framebuffer object)渲染到纹理FBO1是 GL_EXT_framebuffer_object 扩展多种对 象中最主要的对象,它封装了所有的帧缓存相关的状态。每个 FBO 都被做为逻辑缓存(logical buffers)的标示符。逻辑缓冲 可以是颜色缓存、深度缓存或模板缓存。逻辑缓存能够独立创 建并绑定到 FBOs图 2 利用 FBO 直接渲染到纹理(framebuffer objects)上。一个 FBO 可以与一个以上的颜色缓 存,一个深度缓存和一个模板缓存绑定。一个逻辑缓存也可以 同时与多个 FBOS 绑定。每个 FBO 都有一套绑

7、定点用来绑定多 个逻辑缓存。当使用 FBO 时候,就可以使用离屏渲染,并将传 统的帧缓冲区自动关闭,将图像直接渲染到逻辑缓存,这样避 免了纹理复制过程,降低了计算机开销。如图 2 所示。2.2GPU 可编程渲染管道使用 GPU 可编程渲染管道大大提高了显卡编程的灵活精品论文性,随着显卡性能的逐日提高,可以由显卡绘制出更真实的特效。对于环境贴图来说,如果使用了逐象素(Per-Pixel)计算,将 会把效果表现的更加真实。本系统采用 GLSL 着色语言实现此 功能。Vword = M 4 x 4N word = M 3 x3 Vobj N obj(2)(3)2.3 CEM 算法2.3.1 渲染 C

8、ubeMap基本原理是用摄象机对周围六个方向按照一定的角度照 相,获得六幅图片分别作为 CubeMap 的六个面如图 3 示。需要 进行环境映射的物体可能不断发生位置变化,所以需要首先将摄象机方向单位向量E = normalize (e V反射单位向量obj )(4)场景以及场景中的模型的物体坐标移动到世界坐标的原点,由R = (2N word E ) E(5)于六个方向摄象以及 CubeMap 上的二维纹理坐标原点在图片折射单位向量展开之后不全在左下角,所以然后还需要旋转至需要的方向, 转换矩阵如下:T = Nword E 1 2 * 1 ( Nword E ) 2 M i = Ri T(1

9、)* N word * E2.3.3 计算纹理坐标(6)(a)周围环境的六幅图片立方体纹理图由六个二维分量组成,分别对应立方体的六 个面。rx, ry,和 rz 坐标组成了从立方体中心指向待采样纹理像素 的方向向量.应该对哪个面采样有绝对值最大的坐标的符号决 定的,表 1 中的 sc 、 tc 和 ma 分别表示对应二维纹理坐标的 两个分量和 rx、ry、rz 中的最大值。计算公式(7)、(8)。经计算 得到的纹理坐标映射到0,1上,以生成坐标(s,t).然后在立方体 纹理图的相应面上,就可以使用相应的纹理坐标实现二维纹理 图的采样2。表 1 纹理坐标映射到二维面上(b)最后渲染到 CubeM

10、ap 纹理上的图片 图 3 渲染 CubeMap2.3.2 计算纹理采样方向s = ( sc mat = ( tc ma+ 1) 12+ 1) 12(7)(8)首先求的模型矩阵并将模型的物体顶点坐标和法向坐标转换 为世界坐标,然后在世界坐标中计算反射折射向量。摄象机坐标为 e ,模型世界转换矩阵为 M 4 x 4 ,模型法向从物体坐标到 世界坐标的变换为 M 3 x33 实现过程3.1 预处理3.1.1 创建 CubeMap 纹理存储空间步骤 1 生成纹理 CubeMap 对象标识; 步骤 2 绑定当前 CubeMap 纹理;步骤 3 设置 CubeMap 纹理;3.12 为 FBO 设置标识

11、;glGenFramebuffersEXT(1,&fb);3.1.3 创建深度缓存步骤 1 为渲染缓冲对象指定标识; 步骤 2 绑定当前渲染缓冲;步骤 3 分配深度缓存空间; glGenRenderbuffersEXT(1, &depth); glBindRenderbufferEXT( GL_RENDERBUFFER_EXT, depth);glRenderbufferStorageEXT( GL_RENDERBUFFER_EXT, GL_DEPTH_COMPONENT16, SIZE,SIZE);3.2 实时渲染 CubeMap在每帧图象执行前,都需执行以下代码,从而实时更新CubeMap

12、。3.2.1 设置视口和投影矩阵;3.2.2 绑定当前 FBO,并连接深度缓存; glBindFramebufferEXT( GL_FRAMEBUFFER_EXT,fb); glFramebufferRenderbufferEXT(GL_FRAMEBUFFER_EXT, GL_DEPTH_ATTACHMENT_EXT, GL_RENDERBUFFER_EXT, depth);3.2.3 对 CubeMap 的六个面进行渲染;FOR(i=0;i6;i+)步骤 1 将 FBO 连接点指向 CubeMap 第 i 个面; glFramebufferTexture2DEXT( GL_FRAMEBUFF

13、ER_EXT, GL_COLOR_ATTACHMENT0_EXT,GL_TEXTURE_CUBE_MAP_POSITIVE_X+i, tex,0);步骤 2 清除 FBO 该连接点对应的帧缓存;步骤 3 模型视点矩阵转换; 步骤 4 绘制环境场景;3.2.4 使 FBO 无效; glBindFramebufferEXT( GL_FRAMEBUFFER_EXT,0);3.2.5 恢复到正常视口和投影矩阵;3.3 渲染模型渲染模型采用 GPU 可编程渲染管道,包括两个管道,顶 点处理器和片段处理器。顶点处理器在本系统中实现顶点坐标 变换,计算摄象机向量和顶点光源向量,以及反射向量和折射向量;片段处

14、理器进行纹理采样和计算光照强度。实现过程如下:3.3.1 顶点着色步骤 1 计算模型世界矩阵;步骤 2 求在视点坐标中顶点的位置,法向方向向量,摄 象机方向向量;步骤 3 计算反射和折射向量; 步骤 4 计算光照参数;3.3.2 片段着色步骤 1 计算求反射和折射方向的采样值; 步骤 2 计算光照;步骤 3 返回总的颜色颜色值。3.4 实验结果(a) 仅有折射时的飞机模型 (b) 仅有反射时的飞机模型(c) 反射和折射共同作用 (d) 反射、折射和光照共同 时的飞机模型作用的飞机模型图 4 境映射效果 本程序运行的平台是操作系统 windows xp,显卡蓝宝石X600,显存 128M,CPU

15、 INTEL P4 3.0GHZ,内存 512M 编译环境 VC6.0,图形接口 OPENGL 着色语言 GLSL,效果如图 4 所示, 周 围环境为海面蓝天,绕飞机旋转的是带有纹理的球体.其中(a) 是开启折射时的效果,(b)是开启反射时的效果,(c)是开启反射 可折射时的效果,(d)是开启反射、折射和光照时的效果。达到如 图 4 的图象质量,如采用本文介绍的方法运行,FPS 平均为 310, 而采用用 glCopyTexImage2D()和 glCopyTexSubImage2D()函数 进行动态 CEM 时 FPS 平均为 210,显然本文介绍的方法比后者 绘制速度更快。由于本程序采用了

16、 GLSL 进行逐象素光照和纹 理坐标计算,与 OPENGL 固定渲染管道的逐顶点光照和纹理坐 标计算相比,大大提高了图象质量。4 结论动态 CEM 技术是真实感图形显示研究的重要的内容,由于立方体环境映射需要多遍渲染,则动态 CEM 的图象更新速率 是不得不重视的问题。本文采用 FBO 来加快 CubeMap 的更新 速度,以及 GPU 编程语言 GLSL 提高图象质量。实验证明,如 果需要环境影射的物体的顶点数量越少,本文介绍的方法优势 越明显。由于本系统中的折射仅仅计算模型面向视点的单层面 的折射,结果并不完全真实,未来的研究方向应该就模型前后 两层面上的折射进行加速显示研究。参考文献1

17、 Khronos,EXT_framebuffer_objectEB/OL,2007-2-13,http:/www.opengl.org/registry/specs/EXT/framebuffer_object.txthttp:/ NVIDIA Corporation,OpenGL Cube Map,TexturingEB/OL,1999,http:/ 高光磊 (1983-7),性别男,南京航空航天大学机电学 院硕士研究生,研究方向计算机图形学 Email: 陈炳发(1963-3)男,硕士,教授,硕士生导师,研究方向为 计算机图形及应用,计算机辅助工业设计,图象处理,计算机 视觉,数据库应用,

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

当前位置:首页 > 其他


经营许可证编号:宁ICP备18001539号-1