前些日子一直在了解OGRE引擎,感觉里面的材质脚本那一块封装得非常的完美,这里的完美是指使用起来有种独特的层次感。于是开始查阅d3d effect的资料,想从中构思出一种引擎模式的结构。
目前的3D游戏总是会碰到一些问题,比如说某些特效对显卡有独特的要求之类的,让画面效果和兼容性很难得到保证。于是正好碰上这段时间公司对全3D引擎的迫切需求,我们组开始制作一套全3D的引擎,于是我对视觉效果这一块决定使用d3d effect来进行封装。
根据不同的画面视觉效果,可以选用不同的effect来进行渲染,而effect里面的technique则按照从最低显卡要求到最高显卡要求分为fixed pipeline到ps/vs 3.0的标准,分为4个不同的technique,比如说realtime shadow,可以用从shadow mapping到pixel soft shadow来实现不同等级的效果。地面贴图也可以从细节纹理到normal map实现不同的效果,这样一来,可以在初始化的时候决定使用每个effect的某种technique,这样对于开发者来说,shader或者effect将不在暴露出来,他们所需要做的,只是选择不同的渲染效果,一方面让项目部门可以专心的来实现游戏的逻辑,不再需要为画面效果而操心,也可以让引擎维护的工作变得有条不紊。让画面效果和数据管理分离开来。
之前一直在考虑shader的封装问题,想来想去一直没想到什么比较完美的答案,究竟shader应该是由应用层来定,还是应该由引擎来定呢。在经过若干次的考虑和大量的阅读文章来看,我最后还是决定将shader这一层封装到引擎里,让它不再对外可见。好处就是,开发部门不再需要为针对不同的机器配置而花大量的时间去考虑各种实现效果的取舍,也让引擎的开发变得和项目越来越不相关。
其实很多技术都很好实现,关键是如何应用的问题,那么一旦这个接口没留好,则导致很多项目想用,却因为其单一的实现方式而导致对用户机器配置有要求而不得不放弃。但是在做引擎演示的时候,很多时候又不得不拿出最好的效果来。
:P 贴一张最近实现的BLOOM的效果图。。