上下求索
探索DirectX9.0)

shaderx3中的这篇paper现在看来明显已经成为了3d game engine设计的commom sense。

下面按照文中的章节标题进行摘要性的叙述:

Assigning Shaders to Geometry

  文中提到,将物体的shader分成2种,一种是静态物体的材质例如毛皮,凹凸等等,一种是动态环境例如动态光影,体积雾等等。在进行动态shader的计算的时候如果动态环境是具有体积效果的话,需要找出受动态环境影响的可渲染物的集合。


Rendering Order

  文中将渲染基本的纹理贴图和静态光照称为Base Pass。将其他的动态效果或者是其他shader的渲染称之为Effect Pass。

  在进行渲染的时候,常识是先进行不透明物体的渲染,再进行透明物体的渲染。但是在多pass渲染的情况下这个方法就不那么灵验了。多pass的情况下使得渲染顺序的复杂度剧增,为了解决这个问题,并能够协调诸如钩边,体积雾等技术,文中提出了以下解决方法:

  

Code

   将Effect Pass的渲染分为了Pre-Base Pass和Post-Base Pass。例如要进行卡通渲染的钩边,常用的做法是在VS中根据normal进行,这一步放在Pre-Base中进行。而使用Blend方式的渲染动态光源则放在了Post-Base Pass中进行。有时候在同一个阶段可能会存在多个需要渲染的pass,例如动态光照和体积雾的渲染,都是放在Post-Base Pass中进行,这个时候可以给shader加上一个sort key,这样就可以保证体积雾的绘制始终在动态光照绘制之后进行。

shader callback functions

   文中提到,在进行每帧渲染前以及每个批次的几何体渲染前分别提供回调函数,以进行渲染前的最后修改。这点倒是和Gamebryo的实现很像,Gamebryo的Render系统的设计中也是提供了这样的一组回调函数,用意也和本文观点一致。

  文中举出了2个使用回调函数的例子,一个是进行光照渲染的时候,使用回调函数计算几何体受哪些光影的影响,另一个例子是在渲染毛皮的时候,使用到摄像机的距离选择毛发的shell长度。

Reducing Overhead for State Setup

   为了减少渲染状态的切换,文中提出的方法有:对透明以及不透明物体进行排序;在shader对象中提供接口,能够查询shader使用了哪些特殊的纹理,例如光照贴图,法线贴图等等,对这些使用特殊纹理的shader设置需要的渲染状态,否则不进行渲染状态的绘制。另外再进行渲染状态设置前,查询当前的渲染状态,如果和要设置的状态一致的话,就不进行API的调用,毕竟调用改变渲染状态的API耗时还是比较多的。

 Texture

  文中提到,为了灵活的使用程序生成的纹理(CPU端生成的过程纹理)和通过美术制作的纹理,使用另一种叫做纹理修改器的技术,纹理修改器是一个函数,接受一个纹理,然后通过某种算法将纹理中的像素转化为想要的效果,例如转化为灰度图,添加alpha通道等等。纹理修改器提供给了使用引擎的人一定的灵活性,用户可以自定义修改器,来进行纹理的修改,在某些运行时的情况下,这种功能是很方便的。

 

posted on 2009-04-23 23:17  大河马和小魔鱼  阅读(830)  评论(1编辑  收藏  举报