渲染流程替换

  年后替换了Ogre的主要渲染流程,一直没有机会梳理,如今都已经有一些淡忘了.当时想替换它的渲染流程有两个 原因,第一是美术对实时灯光的需求越来越大,包括是场景,特效都会有实时灯光的需求,而以前的是前向渲染,对 灯光复杂度高的场景支持不好(灯光数,场景复杂度与灯光复杂度成几何倍数关系).第二是Ogre的通用性带来了很 多效率上的浪费,比如说pass的设置会有大量的不必要判断,rs切换浪费.于是我将他替换为后向渲染来支持灯光 复杂度,将渲染物件分类来达到rs切换的不浪费,并且将renderable的组织方式由stl容器组合变成了renderable 内部串联的list方式.
  在修改的过程中有些地方让我犹豫很久,比如说做direcitonal light的阴影时.我现在是将directional  lighting,ambient 和 shadow 放在一个全屏幕pass上的,而没有将它们分开为2个全屏幕pass,一个lighting,一个shadow,ambient.这样做的目的主要是为了节约pixel fill.但是如果有些物体接受lighting,但不被shadow的话,第一种方式就会有问题,因为就算我知道哪个pixel是不被shadow的,我也拿它没办法.why?这样来说,我能想到判断pixel不被shadow的办法有两种,第一是stencil buffer,但是它会完全去掉direction light的计算,这个是不能接受的.第二是在gbuffer上打标记,但是我们的gbuffer已经很拥挤了,我无法再将它挤进去.如果增 加gbuffer的数量,那合并directional lighting,ambient 和 shadow的意义就没有了.当然还有个方法来处理 那种不接受shadow的renderable,就是它不走后向渲染,走前向渲染.这个方法比较适合不接受光照的物体.还 有一个地方思考了很久,就是对透明物体的处理,这个是后向渲染的死穴.很多书对后向的透明处理有一些独特 的解决方案,比如说shaderX7里面就用交叉行来存储前后混合物体的gbuffer,但是这些方式都只能用于很特殊的 地方,有使用环境的限制.最直接的方式就是后向不处理透明,透明直接走前向.不知道有没有其他更好的方式 ,希望大家多多指导一下.

  现在还是有一些问题有待解决,比如说overdraw过大,rs的切换,和render device event还是有点多

posted @ 2012-05-11 13:25  PbLite  阅读(260)  评论(0编辑  收藏  举报