缓冲区|UE渲染师Dyomin:做次世代手游,可以用好这项技能( 三 )



缓冲区|UE渲染师Dyomin:做次世代手游,可以用好这项技能
文章插图

我刚才说了Android Vulkan和iOS Metal,但Android OpenGL是怎样的呢?

缓冲区|UE渲染师Dyomin:做次世代手游,可以用好这项技能
文章插图

使用Gl拓展项时,是可以实现高效的延迟着色的,有两种拓展项可以低消耗地访问芯片上的像素数据。
首先是像素本地存储,支持它的有Mali GPU以及 ImgTech PowerVR GPU。但Adreno GPU不支持它。
第二个拓展项是着色器帧缓冲区读取,它拥有其它Adreno的支持,但Mali GPU不完全支持它。在Mali上,你只能用这个帧缓冲区拓展项来读取单个附件的数据。所以我们必须针对每种GPU做不同的延迟着色支持,我们可以在运行时为着色器打补丁,从而实现这点。这取决于设备的GPU。
我们已经有了可用的原型,它兼容像素本地存储以及帧缓冲区拓展项。我们仍在反复雕琢一些细节,让它在最新版本中完全发挥作用。
有了延迟着色,我们现在就能支持更高质量的反射,可以混合影响到每个像素的所有反射捕捉,并正确地与非静态天空光照反射进行混合。
延迟着色,进一步提升光照渲染质量
现在我们来聊一聊我们做过的一些光照渲染方面的优化。
当我们采用平行光时,就会有FullscreenQuad。FullScreenQuad会计算屏幕上每个像素的光照,但我们并不需要为每个采用无光照着色模型的像素应用着色。那么在我们渲染到G缓冲区,渲染无光照着色模型时,我们能做些什么呢?
我们可以写入到无光照像素的模板。在这么做的时候,应用光照我们可以配置模板测试,还可以过滤掉所有无光照像素。这是一种很棒的优化,尤其对于有室外环境的游戏来说,它们有天空场景,往往会使用无光照着色模型。天空往往占据一半左右的屏幕,所以你就可以抛弃一半的像素。

缓冲区|UE渲染师Dyomin:做次世代手游,可以用好这项技能
文章插图

另一项优化在渲染体积时,可以被应用在局部光照渲染上。例如对于聚光灯光源,我们会试着着色所有在体积内的可见像素,但我们只需要为那些与光照体积相交的几何体上的像素着色就行了。

缓冲区|UE渲染师Dyomin:做次世代手游,可以用好这项技能
文章插图

在这例子中 可以看到光照体积实际上只照亮了地板上的一些像素和地板上的盒子。有一种旧算法,它使用双pass技术会调用未受到光照体积影响的像素,所以我们就会把每个光照体积渲染两次。
在第一个pass我们并不写入到颜色缓冲区,我们只渲染体积的正面。我们在深度测试失败时更新模板,在第二个pass 我们渲染同样的体积,但采用光照着色器只渲染背面。

【精彩生活】jing111.com小编为您精选以下内容,希望对您有所帮助: