SweetDream
高歌一壶新酿酒,醉抱青山不必归。
    这个Demo显示了OGRE可以根据深度缓冲来自动地正确渲染多个重叠的透明物体。NEHE_Lesson 8 中有说:渲染透明物体正确的方法是在整个场景绘制完之后再绘制所有的透明 (alpha < 1.0) 多边形, 而且要按照由远及近的深度顺序, 这是由于事实上按照不同的顺序混合两个(12)多边形会得到不同的结果。 假如多边形1距离我们最近, 那么正确的方法是先绘制多边形2 然后是多边形1 如果你看着它, 那么真实情况就是它们后面的光首先经过多边形2 然后经过多边形1 最后到达你的眼睛。 所以, 你需要按照深度将透明的多边形进行排序, 开着深度缓存并在整个场景绘制完毕之后再绘制它们, 否则将得到不正确的结果。

渲染队列保存了所以这一次必须要渲染的物体的信息。它的构成比较的复杂,渲染队列被分成了好 多个组(group),这些group都和一个id对于,越小GroupIdgroup就越先渲染。而每个group又被分成了很多个 PriorityGroup,每一个PriorityGroup同样对于一个id,同样是越小的id就越先渲染。而PriorityGroup就是比较基本的渲染单元了。经过两次划分以后为于同一个PriorityGrouprenderable再次分组,这是因为透明物要进行特殊的处理,需要作透明处 理的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 所有这种MaterialRenderable

      {

        渲染这个renderable

      }

    }

 

    // 透明部分

    sort()

    for 每一个renderable

    {

      SetMaterial()

      渲染这个renderable

    }

  }

}

posted on 2006-02-22 16:55  SweetDream  阅读(434)  评论(0编辑  收藏  举报