`
yanlijun250
  • 浏览: 750870 次
文章分类
社区版块
存档分类
最新评论

GamerClass Shading系统设计【一】Preview

 
阅读更多

GC的Shading系统终于有点成果了!被郁闷了两三周的时间,做DS都没这么麻烦。

在制作的过程中有一些经验和教训,准备跟日记结合,重新组织一下写下来。

GCShading修改后的设计也不一定就是最好的,这里只是想把思路组织一下,把经验和教训分享一下,特别欢迎众位前辈拍砖、指正!

由于要写的内容太多,一两天内来不及写完,因此,可能会在之后一段时间写一组连载,请多包涵。 *^_^*

Preview

Shading的概念,在之前翻译那篇Tabula rasa的文章中给出了一个参考:

在计算机图形学的词典里,Shading表示“对受光物体的渲染”,这个渲染过程包括下面几步:

1 计算几何多边形(也就是Mesh)。

2 决定表面材质特性,例如法线、双向反射分布函数(bidirectional reflectance distribution functionBRDF)等等。

3 计算入射光照。

4 计算光照对表面的影响,并最终显示。

在进行外包实现的过程中,由于需求的变化,受光是一个经常变化的选项。在真实感光影上,我们就已经有诸多选择,即便是最终决定了使用Deferred Shading进行全场景动态光影之后,针对是否使用静态光照图仍然有一些讨论——毕竟,目前来说,动态的优势在于交互,但是静态的优势在于真实。

GC初始的设计,是一切围绕着材质转,材质决定其渲染模式,Shading Environment决定材质的渲染。Render System这个Singleton,拿到材质之后,根据当前的渲染环境,决定对其的渲染。如下图:

GC Shading旧设计

这样的考虑主要是为了之后节点化材质系统所考虑(不太明白节点化概念的朋友可参考Mental Mill),材质如果节点化之后,意味着Shader代码需要与材质绑定了。这样,一个自然而然的想法就是——材质成为Shader的载体。

但是,首先我们就必须面对一个问题:Mesh,有没有Skin,与Shader是有关的,有Skin就必须在Shader里写Bone数组,写Bone处理。但是,材质知道这些,合适么?不合适。

此外,一旦渲染模式、受光模式有所变化,材质类型就变得复杂起来,有些材质是静态光照图,有些材质是动态光影,甚至需要有材质类型支持顶点光照——听起来很可笑,到底是不是动态光影,凭什么由材质支持呢?材质是用户使用的,用户只要指定纹理、半透明、是否进行深度检测之类的不就可以了么?一个材质,能进行顶点光照,凭什么就不能进行动态光影呢?

现在GC面临的问题是,切换不同的渲染需求、光照模式后,材质被迫需要修改,这是我们所不想见到的。

另一方面,由于DX10本身日益显露的“过渡产品”特征,因此在GC的编码中,不断在考虑迁移到DX11平台的问题。这样的话,“描述”与“实现”分开就特别必要了。如果我们把材质、受光、Skin之类的渲染需求都升格为“描述”,那么,“实现”是可以独立处理的。这种想法也促使我们下决心处理掉GCShading系统,进行重新设计。

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics