• 渲染流程替换


      年后替换了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还是有点多

  • 相关阅读:
    _DataStructure_C_Impl:图的邻接矩阵存储
    ios的单元測试OCUnit以及更新了之后的XCTestCase
    java之 ------ 可变參数和卫条件
    【能力提升】SQL Server常见问题介绍及高速解决建议
    NYOJ 116 士兵杀敌 (线段树,区间和)
    Spring和MyBatis环境整合
    TypeScript和JavaScript的一些小技巧记录
    VSCode配置TypeScript
    function 与 => 的区别
    Egret里用矢量挖圆形的洞
  • 原文地址:https://www.cnblogs.com/pbblog/p/2495868.html
Copyright © 2020-2023  润新知