Depth of Field with Bokeh
「天然ボケに注意せよっ!」-とあるゲームBGMタイトルより
第一次在游戏塚见到这个特效应用是JustCause2在里,当时的benchmark里面有提及是xxx写的一个滤镜,就没仔细虑。后来在在Crytek的presentation里面也有提及,说这个特效十分消耗资源。后来在UE3里面也出现了。自己观察了下发现效果实在是棒,又是一个次时代必备特效啊。
动手之前搜索了一下网上贴出来的代码。发现一般论坛里面贴出来的代码全都是给出了一个post effect的滤镜。用事先准备好的滤镜进行采样,同时计算DOF。当然具体的算法因人而异,有些人喜欢写的很复杂。。。导致PS中计算量过大,采样次数过多。
另一种是比较用心的同志们,就结果上而言跟UE3的一样,完全自定义的Bokeh样式。具体做法是先计算确实需要出现Bokeh的位置,然后手动贴到指定位置。这里涉及到具体的两个步骤,计算位置的算法可以是通过深度计算CoC,也可以是计算亮度平均值,当然我觉得亮度比较靠谱,毕竟灯光的计算方法多种多样,我们需要的也只是“亮的&模糊的地方给我个Bokeh”这么个要求而已。第二个步骤可以是GeometryShader里面直接输出顶点,也可以直接让VS里面进行顶点变换。虽然不知道UE3具体是怎么实现的,但估计大家的做法差不到哪里去。我所看到的做法两种都有。有人发博文说UE3开始是GS做的,结果效率不达标,后来改成VS版本了。
第一种的缺点很明显,相比较第二种做法而言,不能自定义Bokeh的形状。但第二种又面临效率的问题。具体哪种实用价值高就无法下定论了。
我的做法是第二种+VS贴sprite。Full-size分辨率帧数没有怎么掉,结果比较满意,不知道分辨率高了是不是需要改成1/4
DirectX11的API比较方便的地方在于顶点完全不用从内存输入, SV_VertexID会自动给出顶点信息,老平台恐怕就要指定个几M的顶点数据了。
形状随意
顺便最近把HDR和几个Filter也补上了,新的API里面HDR有专用的格式,可以支持AA了。
然后基础的材质系统也更新了一下,又加了个控制模型移动的小坐标轴(这玩意的大小咱实在搞不定,3ds Max里面貌似是每次都重新计算一次小坐标轴的缩放,或者是先渲染完了再贴到物体的screen position上?总之这个变换算不清楚)
Categories: GameEngine, RedEngine
Comments Off on Depth of Field with Bokeh
« 实时局部反射(Real-time Local Reflection with Bisection Method) | Home | Tile-Based Deferred Rendering »