上一篇分析了KlayGE中实现实时全动态GI的方法,本篇是这个系列的完结篇,主要讲流水线的最后一段:Post process。
Post process
在KlayGE 4.0的Deferred Rendering中,post process主要有HDR、AA和color grading。下面将分别讲述它们的改进。
HDR
在KlayGE 3.12用了filmic tonemapping之后,HDR部分就几乎没有别的改变。这里唯一的变化是最终输出的float4,把亮度存在A通道上。这是为了后面FXAA的需要。
AA
在Deferred框架中,无法使用硬件AA曾经是个恼人的问题。随着这些年各种基于post process的AA方法大量出现,Deferred下AA的问题基本被解决了。
团队成员陈顺斌和郭鹏曾为KlayGE 3.12提供了FXAA。在新版本中,FXAA也升级到了最 ...
上一篇解决了透明物体的渲染问题;本文将挑战另一个实时渲染的神话,实时全局光照(GI)。
实时全动态GI
目前direct lighting在游戏中日趋成熟,比较前卫的游戏引擎已经不满足于diect lighting的效果了,逐渐开始尝试indirect lighting。早期的方法有通过离线渲染light map来实现静态场景、静态光源的GI。接着出现了PRT,可以处理静态场景、动态光源。CE3用了Light Propagation Volumes的方法,不需要预计算,可以产生动态场景、动态光源的diffuse GI。不过其速度和质量确实不敢恭维。难道就不能有全动态场景、全动态光源、diffuse和specular通吃的实时GI方法吗?有!Multiresolution splatting for indirect illumination(MRSII)前来救 ...
上文讲到了如何把信息挤入有限的G-Buffer,另一个在实际中面临的问题是如何渲染透明物体。
透明物体
游戏中透明物体是不可缺少的,对于Deferred Rendering来说,透明物体一直是痛苦的。常见的做法是在deferred rendering的场景之上用forward shading来单独渲染透明物体,但那样就意味着必须单独实现一整套forward shading的流水线。这对于维护和扩展都是很不利的,对性能也很有影响。
在KlayGE 4.0里,我用的方法被称为Deep G-Buffer。其基本过程是,把第一篇所描述的Deferred Rendering流水线复制三份,不透明的物体、透明物体的背面、透明物体的正面分别有自己独立的G-Buffer、lighting pass、shading pass和special shading pass。最 ...
上一篇讲了在KlayGE 4.0中,Deferred Rendering的流水线改进。本篇继续讲G-Buffer的变化。
G-Buffer布局
前面提到了G-Buffer改成了MRT,那么现在就来比较一下新老G-Buffer的区别。老G-Buffer的安排如下:
老G-Buffer是4个通道、每个通道都是fp16的RGBA16F格式。其中normal用Spheremap Transform的方式映射到2个通道;depth单独存一个通道;specular和shininess挤在一个通道内,整数部分为specular * 100,小数部分为shininess / 256.0f。
这样的G-Buffer需要占据64-bit,IO开销不小,而且depth精度有限。如果按照新的MRT G-Buffer扩展到2个RT,就需要再增加一个32-bit的RT。对于不支持Independent MRT的D3D9硬件来说,甚至要增加 ...
Deferred Rendering在KlayGE中已经出现比较长时间了,我也写过系列文章来阐述KlayGE中的延迟渲染。在将要推出的KlayGE 4.0中,Deferred Rendering进入了渲染系统的核心,可以作为更通用更方便的一个渲染封装来使用。
在功能上,KlayGE 4.0中的Deferred Rendering也有了长足的进步。本系列将着重于解析这些新改进。
流水线
先来看看Deferred Rendering的流水线。
在流水线方面,第一个比较大的变化是,G-Buffer改成了MRT的,用类似Deferred Shading的fat G-Buffer来避免在shading pass再次渲染一遍物体。新G-Buffer的布局将在下一篇分解。在shading pass阶段,只需要渲染一个全屏quad,在每个pixel上把材质和光照信息结合就可以了 ...
花了10分钟把ModelViewer中的GPU模型平滑处理从PN-Triangles改进成Phong Tessellation。平滑的效果很好,速度也提高了将近一倍。打开和关闭平滑模式的对比如下:
[caption id="attachment_1450" align="aligncenter" width="600" caption="关闭Phong Tessellation的原始模式"][/caption]
[caption id="attachment_1451" align="aligncenter" width="600" caption="打开Phong Tessellation的平滑模式"][/caption]
注意头部的棱角,打开Phong Tessellation后变成圆的了。
PN-Triangles需要在每个三角形patch的内部计算7个点的position和3个点的normal,并通过它们来二次插值出所有细分出来的顶点的position和normal。而Phong Tesse ...
KlayGE 4.0计划的任务之一,Realtime Caustics已经由Parsifal Wang实现并添加到KlayGE开发版中。目前的实现支持单面和双面折射型caustics的生成,速度极快。
少废话了,上图
正如不久前的帖子所描述的,KlayGE 4.0的渲染系统将会过渡到deferred rendering的框架。这样做
好处
各种效果都可以在这个框架内得到整合、发挥和发展
方便未来编辑器的构建
坏处
只需要一些底层的geek变得不方便了
我现在的考虑是,把渲染系统分为两层,底下一层是API抽象层,负责把图形API抽象成同样的接口;上一层是deferred rendering层,提供高级功能。这样就可以兼顾两种应用需要。
在deferred rendering里面,除了deferred框架本身,还会包含GI、SSVO、HDR tone mapping、FXAA、Color grading以及Stereo。
[zh]
KlayGE游戏引擎的子项目glloader是一个OpenGL扩展载入库。它支持OpenGL核心1.0到4.2,OpenGL ES核心1.0到2.0,同时也支持WGL、GLX、EGL和其他GL/GLES扩展。glloader有一个XML格式的数据库,包含了GL/GLES的所有入口函数、标示和类型定义。
请从这里下载。
[/zh]
[en]
The glloader, a subproject of Klay Game Engine, is an OpenGL extension loading library. It supports OpenGL core 1.0 to 4.2, OpenGL ES core 1.0 to 2.0, as well as WGL, GLX, EGL and other GL/GLES extensions. The glloader also includes a datebase of all entries, tokens and typedefs in GL/GLES in XML format.
You can download it ...
[zh]
KlayGE经历了3.12的合作开发的成功之后,正式向着下一个大版本4.0迈进!4.0不追求有多少新功能,主要目标是对现有的东西进行整合和优化,成为更有效更简单实用的开发框架。该版本大约在2011年12月份发布,这里列出目前的新功能计划。
系统要求变化
支持Shader model 4.0的显卡
必然出现
这些特性一定会出现在KlayGE 4.0中,都有明确的实现方法,不确定性因素较小。
Deferred Rendering层
资源载入框架
优化GI
支持render-to-texture-array
Phong Tessellation
Dual Quaternions蒙皮
可能出现
可能出现的特性要么存在比较大不确定性,要么优先级较低,是否会出现在KlayGE 4.0取决于时间关系。
移植到A ...