GC的Shading系统终于有点成果了!被郁闷了两三周的时间,做DS都没这么麻烦。
在制作的过程中有一些经验和教训,准备跟日记结合,重新组织一下写下来。
GCShading修改后的设计也不一定就是最好的,这里只是想把思路组织一下,把经验和教训分享一下,特别欢迎众位前辈拍砖、指正!
由于要写的内容太多,一两天内来不及写完,因此,可能会在之后一段时间写一组连载,请多包涵。 *^_^*
Preview
Shading的概念,在之前翻译那篇Tabula rasa的文章中给出了一个参考:
在计算机图形学的词典里,Shading表示“对受光物体的渲染”,这个渲染过程包括下面几步:
1, 计算几何多边形(也就是Mesh)。
2, 决定表面材质特性,例如法线、双向反射分布函数(bidirectional reflectance distribution function,BRDF)等等。
3, 计算入射光照。
4, 计算光照对表面的影响,并最终显示。
在进行外包实现的过程中,由于需求的变化,受光是一个经常变化的选项。在真实感光影上,我们就已经有诸多选择,即便是最终决定了使用Deferred Shading进行全场景动态光影之后,针对是否使用静态光照图仍然有一些讨论——毕竟,目前来说,动态的优势在于交互,但是静态的优势在于真实。
GC初始的设计,是一切围绕着材质转,材质决定其渲染模式,Shading Environment决定材质的渲染。Render System这个Singleton,拿到材质之后,根据当前的渲染环境,决定对其的渲染。如下图:

这样的考虑主要是为了之后节点化材质系统所考虑(不太明白节点化概念的朋友可参考Mental Mill),材质如果节点化之后,意味着Shader代码需要与材质绑定了。这样,一个自然而然的想法就是——材质成为Shader的载体。
但是,首先我们就必须面对一个问题:Mesh,有没有Skin,与Shader是有关的,有Skin就必须在Shader里写Bone数组,写Bone处理。但是,材质知道这些,合适么?不合适。
此外,一旦渲染模式、受光模式有所变化,材质类型就变得复杂起来,有些材质是静态光照图,有些材质是动态光影,甚至需要有材质类型支持顶点光照——听起来很可笑,到底是不是动态光影,凭什么由材质支持呢?材质是用户使用的,用户只要指定纹理、半透明、是否进行深度检测之类的不就可以了么?一个材质,能进行顶点光照,凭什么就不能进行动态光影呢?
现在GC面临的问题是,切换不同的渲染需求、光照模式后,材质被迫需要修改,这是我们所不想见到的。
另一方面,由于DX10本身日益显露的“过渡产品”特征,因此在GC的编码中,不断在考虑迁移到DX11平台的问题。这样的话,“描述”与“实现”分开就特别必要了。如果我们把材质、受光、Skin之类的渲染需求都升格为“描述”,那么,“实现”是可以独立处理的。这种想法也促使我们下决心处理掉GC的Shading系统,进行重新设计。
针对GC的Shading系统存在的问题,本文介绍了系统重构的过程及经验教训。文章详细探讨了渲染需求与实现分离的设计思路,以及如何更好地处理材质、光照等渲染需求。
1万+

被折叠的 条评论
为什么被折叠?



