|
![](static/image/common/ico_lz.png)
楼主 |
发表于 2009-5-16 13:04:11
|
显示全部楼层
7、重新讨论PATCH 现在我们已经明白ROAM的所有细节了,让我们重新完成我们的PATCH类吧。所有的递归函数(分割函数除外)都需要从即将渲染的三角形中获得坐标数据,这些坐标需要在栈中进行计算并传送到下一级运算,或通过OPENGL进行渲染。在二元三角树的最深级别,在栈内运算的三角形不会超过十三个。 下面的函数使用了最基本的递归运算:
int centerX = (leftX + rightX) / 2; // X coord for Hypotenuse center int centerY = (leftY + rightY) / 2; // Y coord... Recurs( apexX, apexY, leftX, leftY, centerX, centerY); // Recurs Left Recurs( rightX, rightY, apexX, apexY, centerX, centerY); // Recurs Right
Recursive Patch Class Functions:
void Patch::Split( TriTreeNode *tri);
unsigned char Patch::RecursComputeVariance( int leftX, int leftY, unsigned char leftZ, int rightX, int rightY, unsigned char rightZ, int apexX, int apexY, unsigned char apexZ, int node);
void Patch::RecursTessellate( TriTreeNode *tri, int leftX, int leftY, int rightX, int rightY, int apexX, int apexY, int node);
void Patch::RecursRender( TriTreeNode *tri, int leftX, int leftY, int rightX, int rightY, int apexX, int apexY );
Split()函数进行了包含强制分割处理的ROAM分割。它的功能包括选择合适的钻石,分配子节点,连接他们到网格和调用我们需要的其他分割操作。 RecurseComputeVariance()函数用于获得当前三角形的所有坐标设置和我们保存在栈内的一部分扩展信息。三角的Variance值是和它的子三角一起合并计算的。我选择通过传送每一个点的X和Y坐标而不是每点的高度值来减少在高度图数据数组的内存采样。 RecurseTessellate()完成LOD功能。在计算完到摄像机(Camera)的距离后,它调整当前节点的Variance值,以便于适应距离的变化。它也可以让一个闭合的节点有一个比较大的Variance值。调整后的MESH将在近处使用比较多的三角形而在远处使用较少的三角形。距离的计算使用了一个简单的平方根计算(他比较慢,我将用一个较快的方法来替换它)。 RecurseRender()这个函数非常的简单,但是你必须看一下在下面高级话题中的三角形排列优化技术。简单的说来就是如果当前的三角形不是一个叶节点那么就把它重新并入到子节点中。另外输出一个三角形使用了OpenGL,注意OpenGL渲染并没有被优化,这是为了使代码容易阅读。现在所有的都完成了,你需要做的是去理解代码,接下来将介绍一些高级话题了。
8、引擎的性能 平台:Win98,AMD K6-2 450 Mhz,96 Mb RAM,NVIDIA GeForce 256 DDR video 分辩率:640×480,32位色
Desired # of TriTree Nodes |
Textured FPS |
Solid-Fill FPD |
5000 |
57 |
62 |
10000 |
30 |
36 |
15000 |
20 |
25 |
20000 |
16 |
19 |
漫游引擎的性能 | Variance值得注意事项:Variance值在本引擎中是一个非常重要的变量,它被用在整个框架内。试着更改一下用于Variance树的计算方法,或树的深度。例如设置深度值为非常小的值如3,再试一个比较大的数如13,注意一下渲染性能的差异。
9、高级话题 作为一个承诺,这里有一些关于引擎优化和高级特性的暗示和秘密。他们中的每一个都可以论述成一篇论文,因此在每一个标题中我都尽可能的用最少的段落来描述最重要的内容。
9.1 三角形排列 三角形排列是当所有的三角形都共享一个中心点时你才可以使用的一项优化技术(也就是三角形是按扇形排列的)。它允许你对相同数目的三角形指定一些顶点,并进行改进处理。在OpenGL中三角形排列对每个三角形的点进行处理时是按照顺时针进行的,因此你将不得不去转换待处理三角形所面对的方向否则OPENGL将剔除所有的三角形。为了获得正确的三角形输出,三角形排列将帮助用于改变在每一级别(LOD级别)的渲染过程中遍历子节点的顺序。也就是说如果我们在级别1上首先遍历左子节点,那么在级别2中必须首先遍历右子节点,而级别3又首先是遍历左子节点。 在这里顶点的顺序是非常重要的,第一个被指定的顶点必须是围绕其他三角形“扇形扩展”方向的中心点。这样做是通过传送一个参考值给来做为“最佳中心点(Best Center Point)”一个三角形顶点。在每一个级别上,这个值都被改变为指向一个新的每级“最佳中心点”。当一个叶节点被发现时,它被添加到一个很小的顶点缓冲中,这个缓冲是以一个“最佳中心点”开始,其他顶点以顺时针方向排列。在下一个子节点中,我们只需要把“最佳中心点”和缓冲中的第一个顶点进行比较,如果他们不相等,把扇形输出到OpenGL中并终止。无论如何,如果两个顶点相等的话,那么测试缓冲中最后一个顶点是否等于三角形中按顺时针方向的下一个顶点,如果他们不相等,那么输出扇形到OpenGL并终止。另外要注意添加三角形的最后一个顶点到顶点缓冲的结尾部分。在这个方法中扇形的长度不能超过8个三角形,而平均长度应该为每一个扇形不超过3-4个三角形。
9.2 GeoMorphing 使用动态LOD进行渲染的一个不好的边缘效果是当三角形从MESH中插入或移出时会产生突然的看的见的裂缝,这个现象可以被顶点变形体(MORPHING)简化为忽略不计,也叫几何变形体(GeoMorphing)。它是指一个顶点在几帧的过程中随着从不分割点位置到它的新分割点位置而他的高度随着逐渐升高或降低。 几何变形体并不难,但他也有一些棘手的地方。在分块过程中TriTreeNode结构或许保存有一个等于这个三角形的“MORPH”的值,这个“MORPH”值将被保持在0.0-1.0的范围。在渲染过程中,把插值高度值改变为实际的高度区域值需要使用下面的函数:
MorphedZ = (fMorph * actualZ) + ((1-fMorph) * interpolatedZ); | 9.3 帧的一致性 帧的一致性是ROAM中的高级优化技术,对于这项技术来说,最后一帧建立的网格可以被再次使用。这个特性也可以用来进行动态帧定时,允许你连续的改进当前帧的网格直到这帧结束。在一个高速动作游戏中,这意味着你不必花费时间进行地形分块,相反可以先处理其他最重要的快速动作部件,而在帧时间静止时进行地形分块,而在结束时进行渲染。如果一个玩家在进行交火时,地形将用一个低级细节来动态渲染以保存时间。用本文的空间来解释帧的一致性是远远不够的,但是对于他有一些小的标题步骤:增加一个父节点指针到TriTreeNode中,建立一个不做Split()操作的Merge()函数,使用一个优先队列或其他优先结构来保存整个MESH中的叶节点。在分块过程中,随着分割这一帧中非常粗糙的节点的操作,合并所有本帧中足够DETAIL的节点(或直到时间结束)。
9.4 大拓扑结构支持 本引擎是用来构造一个非常大的世界,在为每一个Landscape类进行高度图载入和渲染每一个地形时,都没有限制它的大小!可是还有其他限制如内存和计算机性能。Landscape类被设计用来保存一个分页的世界块,连同其他Landscape类保存其他块,每一个Landscape必须连接它的patches到附近其他的Landscape中。这是在Patch::Reset()完成,另外设置邻节点指针为NULL。
本文附带的源程序(341KB)
参考文献 [1] Hoppe, H. "Smooth View-Dependent Level-of-Detail Control and its Application to Terrain Rendering" http://www.research.microsoft.com/~hoppe [2] Lindstrom, P., Koller, D., Ribarsky, W., Hodges, L., Faust, N., Turner, G., "Real-Time Continuous Level of Detail Rendering of Height Fields" http://www.cc.gatech.edu/gvu/people/peter.lindstrom/papers/siggraph96 [3] Duchaineau, M., Wolinski, M., Sigeti, D., Miller, M., Aldrich, C., and Mineev-Weinstein, M. "ROAMing Terrain: Real-time Optimally Adapting Meshes" http://www.llnl.gov/graphics/ROAM [4] Binary Triangle Tree Article http://www.longbowdigitalarts.com/seumas/progbintri.html [5]. VTerrain.org Engine Comparison List http://vterrain.org/LOD/runtime-reg.html [6] Outcast Engine Technology Presentation for GDC http://www.appeal.be/products/page1/Outcast_GDC/outcast_gdc_1.htm [7] Longbow Digital Arts Programming Discussion Forum http://www.LongbowDigitalArts.com
译者后记 翻译这篇文章的目的是国内关于这方面内容的东西太少了,而ROAM做为现今最流行的地形渲染技术已经在国外的游戏中大行其道,只有不断的学习才能不断的进步,希望通过这篇文章能使大家得到进步,我就已经满足了,这篇文章你可以转载,但必须署上我的名字,并发到我的邮箱告知我,我的邮件地址是:dreams_wu@sina.com,有什么交流或建议也可以给我发信。 |
|