圣者
精华
|
战斗力 鹅
|
回帖 0
注册时间 2003-11-24
|
本帖最后由 oz01 于 2010-7-8 18:19 编辑
http://www.opengpu.org/viewthread.php?tid=2870&extra=page%3D1
下面是其中一段
Crysis是用Cryengine2制作的,Cryengine3无幸窥见,在这里,先说说确切的Cryengine2的渲染过程。
众所周知Cryengine2,没有使用DeferredShading,所以无法支持太多的光源,主要渲染围绕着阳光进行,而且使用了非常复杂的PixelShader来实现漂亮的材质,所以ZPass预渲染就变得很必要,不然会有很多无用象素被复杂的PixelShader渲染,当然这个和DeferredShading一样,无法支持Blend,所以只有两种,普通和AlphaTest。渲染ZPass为了开启PreZ,肯定要进行排序,先渲染普通物体,后渲染带AlphaTest(当然是使用Shader的Texkill来进行,没有状态切换)的物体。其实标准的ZPass应该是不需要ColorWrite的,但是Crysis利用这个机会,输出了深度到一张R32F,因为视距为八公里,乘一个0.000125映射到[0,1],天空为2。有了深度的G-Buffer,其实就已经可以做很多事了,除了光照外很多的后处理都可以用这张深度缓冲来进行。有了深度后,会先进行AO计算,然后阴影,这都是屏幕空间的计算,然后渲染每个物体都会对这两张图进行采样。AO是一张RGBA,R通道用来存SSAO的结果,G通道用来存2.5DTerrainAO的结果。然后进行一次Blur。阴影是有个Mask的,平行光一般是R,剩下三个通道,大概可以存放三个点光源或者SpotLight吧。然后就是对一张R16G16B16A16F进行HR的高范围渲染。这回DepthFunc已经是Equal了,因为深度已经完全填充。当然,为了PreZ,还是先普通后AlphaTest,然后会看到大量的碎片,因为Z检测会挡掉大量像素。所有着色像素加起来也几乎就是屏幕像素了,除非有两个三角形有点是同Depth的Fighting状态,当然可能性很低。完成后会进行Blend渲染,主要是粒子,玻璃之类的东西。结束后,就要进行HDRToneMap和HDRHighLightBloom了。完成后,接下来有一个EdgeAA,当然除此之外应该还有抗齿过程,只是调试时肯定是要关掉的。EdgeAA是个抗齿的后处理,只使用Depth来提取边缘。然后还有个Glow,大概会把火焰之类的Bloom加大吧。在这之后,就是SunShaft,来加上漂亮的Ray和Beam,最后会进行ColorGrading,完成渲染的最后一步,这样,就能看到Crysis的画面了。这样说是不是有些笼统呢?没关系,如果大家喜欢,我还会继续深入剖析Cryengine渲染的一些技术点,来解读震撼画面背后的故事。今天有点晚了先写到这儿了。
睡前再写一些看了KlayGE后的感想,KlayGE是一款我很喜欢的开源引擎。对于开源引擎来说,没有强大的资金支持,很难开发出像商业引擎那样功能强大的实用引擎。KlayGE这样研究一些新鲜的API,支持OGL3或4,DX11,以及一些好玩的技术的实现,却是真正有帮助的。它的字体算法的设计真的是非常的独到,让我非常震撼,我正在想有什么办法能使缩小时更清晰。像Ogre,Irrlicht那种引擎中既见不到强大的实用性,又没有这样的看点,我个人还是比较无爱的。KlayGE最近又出了FFT的水,对于只能看到SigGraph1999的我来说,还是非常有帮助的,记得上回Ogre有个水体插件,也做了FFT的波动,不过实时CPU刷顶点做法还是有点过了,这了新的Demo看,真的挺兴奋的。
有一点想问下作者,你的DeferredShading为啥不支持HW的AA呢,而使用一个后处理来进行?DX10开始,MRT不是已经可以AA了吗?难道还有什么障碍?
最后发张我现在自己渲染的图,虽然比Crysis差不少,但是渲染技术是差不多的。其实如果时间允许,我真是想自己操刀写个引擎,把Ogre改成这样真不是一般的麻烦,Ogre的渲染体系太古典了,不太适应现代的技术,搞得我动不动接管过来调DX,不然要么性能莫名其妙地不见,要么就是干脆无法实现。不过因为DX9,使用了DeferredShading后只能用后处理来抗齿,其实可以用超级采样,但是舍不得那性能啊。Ogre的材质系统不灵活,导致我一怒之下统一使用了线性过滤,材质糊糊的很不爽。下一步,可能就是要尝试下LPV了,毕竟GI还是很令人Happy的 |
|