



全文预览已结束
下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
实验三:基于BSP技术的室内场景渲染一、实验目的掌握BSP的原理,熟悉Ogre中基于BSP技术的室内场景渲染的使用方法.二、实验仪器Visual Studio 2008三、实验原理及过程/网上检索BSP相关技术BSP Trees英文全称为Binary Space Partioning trees,二维空间分割树,简称为二叉树。BSP原理建立BSP Trees的最初想法是获得一个图元的集合,这个集合是场景的一部分,然后分割这个图元集合为更小的子集合,这里必须注意子集合必须为“凸多边形”。这意味着子集合中任一个多边形都位于相同集合中其它多边形的“前面”。BSP相关技术1、 隐藏面剔除2、 室内场景中光照运算3、 BSP树的预渲染/利用Ogre实现基于BSP技术的室内场景渲染描述程序实现时的思路包括对每个调用的API进行详细说明。关于Radiosity的算法最早是由Goral、Cindy M、Torrance、Kenneth E、Greenberg、Donald P、Battaile和Bennett在论文Modelling the interaction of light between diffuse surfaces提出的。他们使用Radiosity来模拟能量在漫反射表面之间进行传送,漫反射表面对照到表面上的光线在所有的方向上都进行相同的反射,和它相反的是镜面反射表面,它只在反射方向上传播反射光。由于漫反射表面的这个特性,这就意味着对于所有的观察角度而言看起来表面都是相同的,这样对于场景中的每一个表面只需要进行一次光照运算,而且可以在场景的预渲染时进行,因此这项技术被大量的3D游戏所采用。下面我再简短的讲解一下Radiosity是如何工作的,而将主要的精力放在如何使用BSP树来加速Radiosity的计算,对于Radiosity的详细介绍请参考前面的章节。Radiosity技术是设计用来使场景中光照看起来更加真实和光滑,如果我们使用一个一直向前传播而不考虑反射的光照模型,那么当场景中的灯光照亮场景中的物体时,并不会计算远处经过反射过来的光线,这样场景中的阴影看起来非常尖锐而物体表面也看起来非常不真实。为了使用radiosity技术我们需要把场景分割成一块一块很小的部分,每一部分我们称它为patch,每一个patch都有一个初始化的能量级别,如果它不是一个灯光这样的发光体的话通常为0,有许多方法来分配场景中的能量,这里我们将要使用的方法称为交互式radiosity。这个方法的过程是我们从场景中未发送能量的级别最高的patch开始发送能量,能量经过传递后将不再发送能量的patch的等级设为0,重复这个过程直到场景中的每一个patch的能量等级都小于一个预定值为止。当能量从一个patch(j)开始发送到另一个patch(i)时我们使用下面的公式:Bi = Bi + Bj * Fij * Ai / Aj这里Bi = patch(i)的能量级别 Bj = patch(j)的能量级别 Ai= patch(i)的作用区域 Aj = patch(j)的作用区域 Fij = patch(i)与patch(j)之间的系数在公式中系数Fij是由以下公式来确定的:Fij = (cos qi * cos qj) / d2 * Hij这里Fij = patch(i)与patch(j)之间的系数qi = patch(i)与patch(j)法线之间的夹角qj = patch(i)与patch(j)法线之间的夹角d = patch(i)与patch(j)之间的距离Hij = patch(i)与patch(j)之间的可见性系数。如果在两个patch之间只有一条光线可以跟踪,这个值为1,如果没有光线可以跟踪为0。一般情况下由于每一个patch都不是一个点而是一个区域,因此光线有很多条。从上面的公式中我们可以看到在场景中进行radiosity计算是非常耗费时间的。这个函数的复杂度为O(n3),这里的n为场景中patch的数量。由于对于场景中每一个patch你需要发送最少一条光线到其它patch上,因此需要对场景中的几乎所有的多边形都进行光线跟踪计算。在上面的公式中系数H的计算非常耗费时间,下面我们将看一下如何在BSP树中对它的计算进行优化。 BSP树中的radiosity计算在进行场景中的光照计算之前需要把场景中的面分割为patch,一个方法是在开始的时候设定每一个patch为预定的大小,当计算每一个patch的能量时,如果在patch上的能量足够大,对这个patch进行分割。不过这个方法是非常耗费时间的,因此必须寻找一个更好的方法来通过BSP树对计算进行优化。在radiosity的一般算法中场景中的每一个光源都被看作为一个或多个patch,这里我们可以改进一下,将每一个光源放在它所位于的叶节点中,接下来每一个光源都发送自己的能量到场景中所有的patch上,当这个过程完成后radiosity计算也就结束了。为了使最后的结果看起来更好可以使用一种称为“渐进精选”(progressive refinement)的技术来对这个方法进行很小的修改。在每一次过程中,叶节点中具有高能量的patch将发送能量到其它低能量的patch上,这样做的结果是高亮度的patch将发送能量到处于阴影中patch上。这是因为在实际生活中并没有真正黑暗的地方,它多多少少要获得一些其它物体反射过来的光亮。由于计算非常耗费时间需要做一下优化,使用渲染BSP树时获得的PVS信息可以在选择哪些patch将接受能量时剔除一些无用的计算。因为在计算PVS时使用了相同的方法来进行光线跟踪。通过场景来分配能量的算法如下:l 函数RADIOSITYl 参数:l Tree 进行radiosity计算的BSP树。l 返回值:l Nonel 功能:l 在场景中的patch之间发送能量。RADIOSITY (Tree)1 for(each leaf L in Tree)2 for(each light S in L)3 for(each leaf V that is in Ls PVS)4 Send Ss energy to the patches in Vl 下面语句5是为了让地图编辑者在任何时候都可以检查场景渲染的效果,如果他感到看起来已经足够好了可以中断能量的传播。5 while(not looks good enough)6 for(each leaf L in Tree)7 for(each leaf V that is in Ls PVS)8 Send energy from the patch with the most unsent energy in Lto all patches in V.复杂度分析这个函数的运算费用实在是太高昂了,可以称为时间杀手,在最坏的情况下每一条光线将不得不检测场景中的每一个多边形,此时复杂度为O(n3),这里n为树中patch的数量。一般情况下由于进行了优化可以减少大量的计算,但是减少多少并不能计算出来,因为这依赖于树结构的复杂度。上面的函数给出了一个充分利用BSP树的优点来加速场景光照运算的方法,尤其是可以显著的减少光线跟踪的计算量,而且地图设计者可以来决定当场景渲染时如果渲染的效果可以接受中断渲染循环。这对地图的预渲染实在是太方便了,运行的时间可以根据渲染的效果来决定。四、实验结果 五、主要代码void loadResources(void)mLoadingBar.start(mWindow, 1, 1, 0.75);/ Turn off rendering of everything except overlaysmSceneMgr-clearSpecialCaseRenderQueues();mSceneMgr-addSpecialCaseRenderQueue(RENDER_QUEUE_OVERLAY);mSceneMgr-setSpecialCaseRenderQueueMode(SceneManager:SCRQM_INCLUDE);/ Set up the world geometry linkResourceGroupManager:getSingleton().linkWorldGeometryToResourceGroup(ResourceGroupManager:getSingleton().getWorldResourceGroupName(), mQuakeLevel, mSceneMgr);/ Initialise the rest of the resource groups, parse scripts etcResourceGroupManager:getSingleton().initialiseAllResourceGroups();ResourceGroupManager:getSingleton().loadResourceGroup(ResourceGroupManager:getSingleton().getWorldResourceGroupName(),false, true);/ Back to full renderingmSceneMgr-clearSpecialCaseRenderQueues();mSceneMgr-setSpecialCaseRenderQueueMode(SceneManager:SCRQM_EXCLUDE);mLoadingBar.finish();/ Override resource sources (include Quake3 archives)void setupResources(void)/ Load Quake3 locations from a fileConfigFile cf;cf.load(quake3settings.cfg);mQuakePk3 = cf.getSetting(Pak0Location);mQuakeLevel = cf.getSetting(Map);ExampleApplication:setupResources();ResourceGroupManager:getSingleton().addResourceLocation(mQuakePk3, Zip, ResourceGroupManager:getSingleton().getWorldResourceGroupName(), true);/ Override scene manager (use indoor instead of generic)void chooseSceneManager(void)mSceneMgr = mRoot-createSceneManager(BspSceneManager);/ Scene creationvoid createScene(void)/ modify camera for close workmCamera-setNearClipDistance(4);mCamera-setFarClipDistance(4000);/ Also change position, and set Quake-type orientation/ Get random player start pointViewPoint vp = mSceneM
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 华夏银行贵阳市云岩区2025秋招面试典型题目及参考答案
- 光大银行济宁市兖州区2025秋招数据分析师笔试题及答案
- 光大银行无锡市宜兴市2025秋招笔试价值观测评题专练及答案
- 家电跨品类考试题及答案
- 招商银行北京市顺义区2025秋招笔试热点题型专练及答案
- 广发银行天津市宝坻区2025秋招信息科技岗笔试题及答案
- 2025年执业药师之《西药学专业一》题库附参考答案详解【黄金题型】
- 防城港市2025中共防城港市委员会党校招聘编外聘用人员2人(广西)笔试历年参考题库附带答案详解
- CAD三维建模技术指导
- 增强皮肤保养大揭秘
- 广东省佛山市南海区石门实验学校2025届数学七上期末经典模拟试题含解析
- 学校食堂诺如病毒防控培训
- 学堂在线 如何写好科研论文 章节测试答案
- 旅馆顾客财物管理制度
- 交通设施韧性提升-洞察及研究
- GB/T 45808-2025眼科光学接触镜和接触镜护理产品基于接触镜结合接触镜护理液评价其相互作用的细胞毒性试验
- CJ/T 340-2016绿化种植土壤
- T/CADBM 63-2022建筑室内窗饰产品百叶帘
- 购车没过户协议书
- 转让店铺欠款协议书
- 银行行测考试试题及答案
评论
0/150
提交评论