Rendering Sequence(渲染序列)
Unigine 2的渲染流水线包括:
- Deferred rendering pass(延迟渲染通道),默认用于所有非透明对象。
- Forward rendering pass(正向渲染通道),用于透明对象。
- Auxiliary rendering pass(辅助渲染通道),用于后处理材质。
Unigine 1中使用的是正向渲染器。 所有的几何体都使用的是正向通道来渲染,并且光栅化处理的次数还要取决于光源的数量。 因此,拥有复杂场景(含有大量的高密度多边形几何体及光源)的项目需要为其提供强大的计算能力才能保障有好的性能。
到了Unigine 2就改用了全延迟渲染器。 所有Opaque(不透明)-【非透明】的几何体都使用延迟通道来渲染。 正向渲染通道可用来渲染特殊的透明对象,不过,透明对象也可使用延迟通道来渲染。
渲染流水线
- 共用通道(Common pass)
- 相交(Intersections)
- 渲染阴影贴图(Shadow Maps)
- 渲染动态反射(Dynamic Reflections)
- 延迟通道(渲染不透明对象)
- 延迟通道(渲染透明对象)
- 正向通道(渲染透明对象)
- TAA
- 渲染后处理(Render Post)材质
- 摄像机效果
- 最终屏幕合成
- 后处理(Post)材质
共用通道(Common pass)
共用通道是渲染的第一路通道:LUT纹理,环境立方体贴图都会在该通道中被渲染。它们的渲染会先于场景中的所有几何体进行,且仅执行一次。
环境立方体贴图由6块拼图组成(每块为256x256像素)。 |
|
1x256像素的LUT纹理示意图。 |
LUT纹理是由1x256像素纹理来表示的,这一像素尺度的纹理取自所加载的散射型LUT纹理的当前状态。 |
相交(Intersections)
这是设置在几何体渲染之前的准备通道。引擎会分析场景的可见部分从而获知所要绘制的内容。它会在该阶段触发如下事件:
- 检查视锥的相交情况。
- 查找场景中的所有光源。
- 查找所有应被渲染的表面(也会考虑Occluder(遮挡器)对象)。
- 按大小排序Environment Probe(环境探针)对象(从大到小)。
- 按Decal(印花)对象自身的渲染顺序来对它们进行排序。
渲染阴影贴图(Shadow Maps)
待相交计算完成之后,阴影贴图将会被渲染。而渲染这些贴图所用的方法则取决于光源类型。
World Light(世界光)
引擎为world light(世界光)光源创建的是Cascaded Shadow Maps(级联阴影贴图)。Unigine 2拥有两种分割类型:球形和矩形。
球形阴影级联。 |
|
矩形阴影级联。 |
World Light(世界光)的阴影贴图会被渲染为正交投影(Orthographic Projection)。
Omni Light(泛光)
对Omni light(泛光)光源而言,其所应用的是透视投影(Perspective Projection)。为了生成阴影贴图,需要用到6部摄像机。
而大量Omni light(泛光)光源的使用则会致使性能明显降低。
Proj Light(投影光)
Proj light(投影光)光源的阴影贴图只被渲染一次,其原因在于它只用到了1部摄像机。
渲染动态反射(Dynamic Reflections)
引擎会在该阶段渲染环境探针的立方体贴图以及用于动态反射的平面反射纹理。为了渲染这些纹理,引擎会完成渲染流水线的全部环节来创建反射。
立方体贴图是借助6部摄像机来生成的,而平面反射则只用到了1部摄像机。两者都采用了一些取巧的方式来渲染最终图像(使用了不止一个渲染周期),它们包括:
- 纹理使用的是阴影贴图,这些贴图已经在之前的阴影贴图渲染通道中生成完毕了。
- 所有后处理特效(post effects)都将被忽略。
- 渲染有动态反射的最终图像未做TAA处理。
延迟通道(渲染不透明对象)
所有的不透明几何体都会在该通道中被渲染。经过此通道之后,引擎就生成了带有全部不透明几何体和散射的图像。
原生深度预置通道(Native Depth Pre-Pass)
填充缓冲区
在该渲染阶段,引擎会填充用于着色的G缓冲区。
Depth(深度)
深度缓冲区存储着当前视角(Field of View)下的场景对象(指的是可以在近端剪裁距离和远端剪裁距离之间找到的)。Objects(对象)是被渲染为纯几何模型后再存储进该缓冲区中的。
其纹理格式用的是RGBA8:
|
引擎的深度缓冲区存储着压缩的深度(该缓冲区是线性的),而原生的深度缓冲区是非线性的。
Diffuse(漫反射)
Diffuse colors缓冲区存储着所有材质纹理的纯漫反射颜色:
其纹理格式用的是RGBA8:
|
Normal(法线)
Specular(高光)
Specular缓冲区存储着场景中对象的高光值。
其纹理格式用的是RGBA8:
|
Translucency(半透明)是用来模拟光线透过对象(例如,叶子)的。
Velocity(速度)
Velocity缓冲区存储着每帧中像素位移的信息。当图像处于静止时,该缓冲区会被零(黑色)值填充。这些值对于启用随机采样抗锯齿(Temporal anti-aliasing (TAA))是必不可少的。
其纹理格式用的是RG16F:
|
Decal Mask(印花掩码)
Light Map(光照贴图)
Light map缓冲区被用来将已烘焙的光照添加进场景。
其纹理格式用的是RGBA16F:
|
A通道存储的是已烘焙的表面环境光遮蔽,环境光遮蔽会与该通道共同发挥作用。
使用控制台命令render_surface_light_map 0可禁用光照贴图的渲染(引擎将只使用A通道)。
渲染印花(Decals)
引擎会在延迟通道(渲染不透明对象)的这一阶段中渲染印花。根据您添加给印花的纹理类型的不同,引擎会将指定类型的纹理添加到当前缓冲区:
Diffuse(漫反射)纹理 |
|
Normal(法线)纹理 |
|
Specular(高光)纹理 |
引擎只简单地在缓冲区的顶部添加了decals(印花)纹理。
辅助通道(Auxiliary Pass)
辅助通道是一种自定义通道。启用了辅助通道的材质将被渲染为辅助纹理。
渲染反射(Refractions)
在该流水线阶段会渲染反射。这些反射会被渲染为要在延迟复合(Deferred Composite)阶段用到的单一Refraction(反射)纹理。
渲染延迟光源(Deferred Light Sources)
在该阶段,光源会被渲染为要在延迟复合(Deferred Composite)阶段用到的它们各自的纹理。
对于事例场景,我们会用到4类光源:1个world light(世界光)的,1个omni light(泛光)的,1个proj light(投影光)的,还有1个environment probe(环境探针)的。
如果您使用了2个或更多个world light(世界光)光源,那么就要有1个world light(世界光)光源是始终在延迟复合阶段进行渲染的,而其它的光源则在本阶段中渲染。
Proj light光源纹理 |
|
Omni light光源纹理和Proj light光源纹理 |
所有光照都会被添加到要在延迟复合阶段应用的单一纹理上。
SSAO
屏幕空间环境光遮蔽(Screen-space Ambient Occlusion,简称SSAO)会渲染出其独有的纹理。该纹理也将被应用在延迟复合阶段。
SSR
屏幕空间反射(Screen-space Reflections,简称SSR)会渲染出其独有的纹理。该纹理也将被应用在延迟复合阶段。
散射(Scattering)
在该阶段,散射是借助之前在共用(Common)通道中获得的环境立方体贴图和LUT纹理来渲染的。
Scattering(散射)纹理。 |
延迟复合(Deferred Composite)
在该阶段,引擎将利用步骤中以及通道中的所有必要纹理来创建带有不透明几何体的最终图像。
延迟复合的渲染是在Scattering(散射)纹理之上进行的
经渲染不透明几何体的延迟通道(Emission(自发光)通道除外)所生成的最终图像。 |
自发光(Emission)
延迟通道(渲染透明对象)
该通道适用带给定延迟alpha融合透明度的材质。
在该延迟通道(渲染透明对象)内,渲染器会重复延迟通道(渲染不透明对象)中的每一步(步骤SSAO,SSR和Decals除外)。
透明对象是借助alpha融合,在不透明对象(延迟缓冲区)之上进行渲染的。此外,alpha值等于零的位置将不参与着色计算。
延迟通道(渲染透明对象)之后。 |
正向通道(渲染透明对象)
尽管Unigine是全延迟渲染引擎,但它仍然可以为透明对象选用正向渲染通道。
在正向通道(也包括渲染透明对象的延迟通道)内,渲染器是要填充延迟缓冲区的(目的是为了让正向透明对象参与后处理特效)。
Ambient Pass
光照通道(Light Passes)
填充延迟缓冲区
正向通道(渲染透明对象)之后。 |
随机采样抗锯齿(Temporal Anti-Anliasing)
渲染后处理(Render Post)材质
引擎在该通道中生成渲染后处理(Render Post)材质的程序式纹理。而这些纹理则都是在启用了TAA之后被应用的。
Shadow Shafts(阴影光束)
引擎在该通道中使用阴影光束填充缓冲区。
摄像机效果
最终屏幕合成
后处理(Post)材质
延迟通道(Deferred Pass)
在延迟通道中只进行一次光栅化处理,目的是为了减小性能开销。 待该过程结束之后,光照会被渲染到基本缓冲区用以创建最终的场景图像。
延迟通道优化
在延迟通道中,42个相同的非透明几何对象(拥有不同材质的情况也照旧)会作为一组,在一个绘图调用中完成渲染。 而Shadows(阴影)则拥有专属的独立逻辑:具有不同材质(由mesh_base材质演变而来)的不同网格,它们的阴影会以42个为一组在一个绘图调用中完成渲染。 渲染器只分组网格(静态的,骨骼蒙皮等等),而不分组其它对象(像billboards(布告板),grass(草场)等等)。
透明对象(Transparent Objects)
材质的Common(通用)标签页内的Transparency(透明度)选项可为对象创建透明材质。 透明对象既可以使用延迟通道渲染,也可以使用正向通道渲染。
在延迟通道中,透明对象会以分组的形式在一个绘图调用中完成渲染。 使用延迟通道渲染的透明对象会叠加其它也采用延迟通道渲染的透明对象。 不过,延迟透明对象提供有逼真的反射效果,在您需要透明对象的场合,这种效果则涵盖了差不多75%的使用场景。
在启用了透明选项后,用于光源的绘图调用数将加倍。
如果启用了材质的Alpha test(alpha测试)选项,那渲染器在一个绘图调用中将不对网格进行分组(绘图调用数将会增加),原因是"Alpha test"选项添加了一个预置通道,深度缓冲区会在这里被再一次渲染。
正向通道(Forward Pass)
Forward rendering pass(正向渲染通道)仅适用透明对象。 要想激活正向通道,须根据上表内容,在材质的Common(通用)标签页内指定Transparency(透明度)选项,并在其States(状态)标签页内禁用延迟透明通道。
透明对象由单一正向通道来渲染。
透明对象(Transparent Objects)
不同于延迟通道渲染,使用正向通道渲染的透明对象不做分组,且绘图调用数会有所增加。 不过它对透明对象进行了排序。 这虽然加大了性能开销,但却可以允许您查看第一(离您最近的)透明对象后面的其它透明对象。
辅助通道(Auxiliary Pass)
辅助通道允许您将带有指定材质的对象的轮廓写入辅助色缓冲区(前提是启用了该通道)。 写入后,您就可以将Postprocess Material(后处理材质)应用给该轮廓了。 后处理材质属于Unigine标准材质库材质的一类,可用来为表面渲染出一些特效(例如,Blurring(高斯模糊),Subsurface Scattering(次表面散射)等等)。
您也可以编写自己的着色器,之后通过该缓冲区来应用您的自定义后处理。
辅助色也可以用在色彩的叠加模式上(用来在主视窗对网格进行平面着色)。 根据辅助色的alpha通道的不同,可以对对象实现全着色渲染或半着色渲染: