ogre图形渲染方式

本文出处:http://www.gpgame.net/docs/program/ogre.htm

小T在soft的鼓动下也开始由2D转入3D了,在学过很多的基础教材以后,小T开始研究些实际的东西,google上搜索了下,发现了ogre这个3D引擎。小T下载了ogre回来,研究了一阵,这里贴一点心得。

ogre是一个不错的3D引擎(至少对于小T这样的初学者来说是这样),而且它是提供源代码下载的。到sourceforge上面搜索就能找到。小T从ogre里面学到了很多的东西,除了3D引擎本身的技术,还有设计模式的冬冬,可以说小T是看过ogre的代码以后才正式的学习起设计模式来的。

今天说说ogre的图形渲染部分的整体架构。

图形渲染的一个比较大的任务就是高效率,高速度,ogre的速度另小T比较满意(嘿嘿)。ogre使用了很多的方法提供图形渲染的速度,一个最最主要的思想就是减少硬件渲染状态的调用,在ogre的源代码里面能充分体现到这种优化。

首先,在ogre里面Material的含义不再是dx里面的只是包含光照信息的那个Material的含义了。ogre把texture也加入到了Material里面(还有其他的很多的信息),这样对于同一种Material最多只用调用一次setmaterial和settexture,甚至在某些情况下,这些调用都是可以省略的。在d3d里面调用SetMaterial和SetTexture都是很花世界的操作,减少了他们的调用就能比较大的提高渲染的速度。

然后,3D世界里面主要的物品就是mesh,ogre的mesh也是经过优化的,它由一个或者多个submesh构成,每个submesh就对应一个Material,绘制的时候submesh是一个基本的单元。

ogre使用了多流的技术,把vertex的positon,normal,texcord这些数据分开,放到多个流里面进行渲染,这方面的技术可以参考mays网站首页上面的文章“D3D中多流的用法”。

下面看看ogre的实际渲染过程。

在ogre里面,场景组织成一棵树形结构,而每一个可以画到屏幕上的物体都是一个renderable,在渲染的时候,ogre遍历场景树,利用剪裁算法(最基本的就是基于视锥的剪裁算法)剔出完全不可见的renderable,把可见的renderable放如到渲染队列里面,最后把渲染队列里面的renderable按照需要进行渲染。

渲染队列保存了所以这一次必须要渲染的物体的信息。它的构成比较的复杂,渲染队列被分成了好多个组(group),这些group都和一个id对于,越小GroupId的group就越先渲染。而每个group又被分成了很多个PriorityGroup,每一个PriorityGroup同样对于一个id,同样是越小的id就越先渲染。而PriorityGroup就是比较基本的渲染单元了。经过两次划分以后为于同一个PriorityGroup的renderable再次分组,这是因为透明物要进行特殊的处理,需要作透明处理的renderable进入一个vector,不要作透明处理的renderable按照它的Material进行分类,有着相同的Material的renderable进行同一个vector。到了最后渲染的时候,按照id遍历每个group,对于每个group,按照id遍历PriorityGroup,对于每个PriorityGroup,首先执行不透明物体的处理,然后把透明物体按照相对摄像机的远近进行排序,依次渲染每一个renderable,然后重复下一个PriorityGroup,然后是group。

for 每一个group
{
for 每一个 PriorityGroup
{
// 不透明部分
for 对于每一种Material
{
SetMaterial() // 包括了texture等等的属性
for 所有这种Material的Renderable
{
渲染这个renderable
}
}

// 透明部分
sort()
for 每一个renderable
{
SetMaterial()
渲染这个renderable
}
}
}

上面的是ogre的渲染伪代码。
至于为什么要把renderable的优先顺序分成两级,比如把3D物品放到同一个group里面,而2D界面放到一个group里面,这样两个group就可以不受对方的影响,各自安排自己的子优先级。

而对于SetMaterial这种操作也尽量的优化,保存一个上次Material的copy,如果当前要设置的Material和上一个的对应成分相同,那么就忽略这次的操作。比如上一次使用的是test.jpg这个texture,而这次的diffuse变化了,但是texture没有变化,那么只是调用了IDIRECT3D9的SetMaterial函数而不用调用SetTexture函数。

到这里,ogre的图形渲染部分的基本原理就介绍完毕。剩下的事情就是自己断点断点,读代码的事情了。

(小T有个习惯,介绍什么东西都只是介绍个整体,只讲大概,不讲细节,嘿嘿)
金点时空 2003.10
tiamo
http://www.gpgame.net

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值