游戏开发论坛

 找回密码
 立即注册
搜索
查看: 1766|回复: 3

Ogre内部的渲染流程分析(4)(原创)

[复制链接]

36

主题

1047

帖子

1147

积分

金牌会员

Rank: 6Rank: 6

积分
1147
发表于 2006-2-28 10:32:00 | 显示全部楼层 |阅读模式
好久没更新这个系列了,今天在同同事的讨论中说到了渲染对象排序的问题,正好自己的引擎也快做到这部分了,晚上回家看了一下 Ogre 的代码,整体如下:
先贴上一张 RenderQueue 的类和数据类型关系图:

数据类型说明:
1. RenderableList:
   原型:typedef std::vector<Renderable*> RenderableList;
   描述:可渲染对象列表。
2. TransparentRenderablePassList:
   原型: typedef std::vector<RenderablePass> TransparentRenderablePassList;
   描述:透明的渲染对象列表。
3. RenderableSolidPassMap:
   原型: typedef std::map&ltass*, RenderableList*, SolidQueueItemLess> SolidRenderablePassMap;
   描述:以Pass分组的非透明可渲染对象列表,每个Pass对应一个到多个可渲染对象,也就是说将相同渲染状态的对象作为一组进行渲染,减少渲染管线的切换操作,提高渲染性能。
4. RenderPriorityGroupMap:
   原型: typedef std::map<ushort, RenderPriorityGroup*, std::less<ushort> > PriorityMap;
   描述:以优先级分组的可渲染对象队列的列表,以优先级作为列表中每一项的关键字。
5. RenderQueueGroupMap:
   原型: typedef std::map< RenderQueueGroupID, RenderQueueGroup* > RenderQueueGroupMap;
   描述:以渲染分组ID分组的渲染队列的列表,以渲染分组ID作为列表中每一项的关键字。所谓渲染分组标示(RenderQueueGroupID)就是标示粗粒度分组,比如2D背景一定会先渲染,天空会次之,2DUI可能会最后渲染,Ogre中已经定义好了一系列的粗粒度分组号,具体参考枚举类型RenderQueueGroupID的定义说明,大部分渲染对象使用的是RENDER_QUEUE_MAIN,这也是缺省的渲染粒度。
对象说明:
1. Pass:
   描述:从顶点到像素的一次生成过程,包含渲染状态的设置参数,比如光照参数、纹理阶段设置、Alpha 混合操作、深度缓冲、雾、裁减方式、填充模式等等,也包含了可编程管线PS\VS的相关设置。
2. Renderable:
   描述:请参考我的《关于 OGRE 中的 Renderable 》的文章。
3. RenderQueue:
   描述:定义了渲染队列,此队列中包含了按照渲染分组ID排序的可渲染对象列表,也就是上面的 RenderQueueGroupMap 类型。这里会进行最粗粒度的排序,按照2D背景、天空、场景对象、2DUI等进行排序。SceneManager 中包含此对象。
4. RenderQueueGroup:
   描述:渲染队列组,按照渲染对象的渲染优先级别排列的渲染对象列表,此类中拥有一个上面的 RenderPriorityGroupMap 类型成员。
5. RenderPriorityGroup:
   描述:渲染优先级组,包含的所有的渲染对象都具有相同的优先级。分出透明对象和非透明对象及其它渲染方式对象,使渲染状态切换最小。其中的渲染对象烈表是以 Pass 分组的,对于半透明物体,每个对象对应一个 Pass。
渲染流程:
每桢更新渲染队列,首先清除 SceneManager 中的 RenderQueue,然后在具体的场景管理器(BSP\OCTREE)中剔除不可见物体,将可见物体按照最粗粒度的划分加入到 RenderQueue 中,RenderQueue 将对象传递到 RenderQueueGroup 中按照并按照指定的优先级加入到 RenderPriorityGroup 中的 SolidRenderablePassMap(非透明) 或者 TransparentRenderablePassList (透明)中,在 SolidRenderablePassMap 中还要按照渲染状态排序,也就是 Pass 排序,将相同 Pass 的对象保存在一个列表中。这样,更新渲染队列的工作就完成了,在渲染时按照已经排好的顺序进行绘制就可以了。
sf_2006228103132.jpg

0

主题

2

帖子

0

积分

新手上路

Rank: 1

积分
0
发表于 2006-3-3 17:01:00 | 显示全部楼层

Re:Ogre内部的渲染流程分析(4)(原创)

分析得很好 如果能再详细点就更好了

0

主题

2

帖子

0

积分

新手上路

Rank: 1

积分
0
发表于 2006-3-3 17:03:00 | 显示全部楼层

Re:Ogre内部的渲染流程分析(4)(原创)

还有那个pass能不能再说的清楚点,OGRE的那个pass.h没看的太明白

36

主题

1047

帖子

1147

积分

金牌会员

Rank: 6Rank: 6

积分
1147
 楼主| 发表于 2006-3-4 23:57:00 | 显示全部楼层

Re:Ogre内部的渲染流程分析(4)(原创)

近期找个时间把详细地说明贴上来。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

作品发布|文章投稿|广告合作|关于本站|游戏开发论坛 ( 闽ICP备17032699号-3 )

GMT+8, 2026-1-23 19:49

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表