This page has been translated automatically.
Programming
Fundamentials
Setting Up Development Environment
UnigineScript
High-Level Systems
C++
C#
UUSL (Unified UNIGINE Shader Language)
File Formats
Rebuilding the Engine and Tools
GUI
Double Precision Coordinates
API
Bounds-Related Classes
Containers
Controls-Related Classes
Core Library
Engine-Related Classes
GUI-Related Classes
Node-Related Classes
Pathfinding-Related Classes
Physics-Related Classes
Plugins-Related Classes
Rendering-Related Classes
Utility Classes
注意! 这个版本的文档是过时的,因为它描述了一个较老的SDK版本!请切换到最新SDK版本的文档。
注意! 这个版本的文档描述了一个不再受支持的旧SDK版本!请升级到最新的SDK版本。

Rendering Sequence(渲染序列)

Unigine 2的渲染流水线包括:

  • Deferred rendering pass(延迟渲染通道),默认用于所有非透明对象。
  • Forward rendering pass(正向渲染通道),用于透明对象。
  • Auxiliary rendering pass(辅助渲染通道),用于后处理材质。
注意
透明对象也可使用延迟通道来渲染。 您可以在材质的Common(通用)标签页内对其设置。 观看下表可了解更多设置内容。

Unigine 1中使用的是正向渲染器。 所有的几何体都使用的是正向通道来渲染,并且光栅化处理的次数还要取决于光源的数量。 因此,拥有复杂场景(含有大量的高密度多边形几何体及光源)的项目需要为其提供强大的计算能力才能保障有好的性能。

到了Unigine 2就改用了全延迟渲染器。 所有Opaque(不透明)-【非透明】的几何体都使用延迟通道来渲染。 正向渲染通道可用来渲染特殊的透明对象,不过,透明对象也可使用延迟通道来渲染。

选项 通道(Pass) 描述 融合设置
Opaque(不透明) 延迟,渲染不透明对象 用于不透明材质 无融合
Alpha blend(alpha融合) 正向,渲染透明对象 标准alpha融合 Src = src alpha
Dest = one minus src alpha
Additive(相加) 正向,渲染透明对象 色彩叠加 Src = one
Dest = one
Multiply(相乘) 正向,渲染透明对象 色彩相乘 Src = dest color
Dest = zero
Deferred alpha blend(延迟alpha融合) 延迟,渲染透明对象 不透明材质被渲染到G缓冲区(图形缓冲区),使用alpha融合 无融合
Custom(自定义) 正向,渲染透明对象 用于自定义配置 自定义

渲染流水线

  1. 共用通道(Common pass)
  2. 相交(Intersections)
  3. 渲染阴影贴图(Shadow Maps)
  4. 渲染动态反射(Dynamic Reflections)
  5. 延迟通道(渲染不透明对象)
  6. 延迟通道(渲染透明对象)
  7. 正向通道(渲染透明对象)
  8. TAA
  9. 渲染后处理(Render Post)材质
  10. 摄像机效果
  11. 最终屏幕合成
  12. 后处理(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)。

注意
您可以在Nodes(节点)窗口中的World Light(世界光)光源的Shadow(阴影)标签页内指定级联的数量。

Omni Light(泛光)

Omni light(泛光)光源而言,其所应用的是透视投影(Perspective Projection)。为了生成阴影贴图,需要用到6部摄像机。

而大量Omni light(泛光)光源的使用则会致使性能明显降低。

Proj Light(投影光)

Proj light(投影光)光源的阴影贴图只被渲染一次,其原因在于它只用到了1部摄像机。

注意
为了能获得更好的性能,建议使用投影光而不是泛光。

渲染动态反射(Dynamic Reflections)

引擎会在该阶段渲染环境探针的立方体贴图以及用于动态反射的平面反射纹理。为了渲染这些纹理,引擎会完成渲染流水线的全部环节来创建反射。

立方体贴图是借助6部摄像机来生成的,而平面反射则只用到了1部摄像机。两者都采用了一些取巧的方式来渲染最终图像(使用了不止一个渲染周期),它们包括:

  • 纹理使用的是阴影贴图,这些贴图已经在之前的阴影贴图渲染通道中生成完毕了。
  • 所有后处理特效(post effects)都将被忽略。
  • 渲染有动态反射的最终图像未做TAA处理。
注意
Update参数(该参数位于Environment Probe对象的设置窗口中)会对渲染产生影响。这一参数指定了在1个更新周期内单个立方体贴图有多少个侧面会被渲染。其最小值并不总代表着更好的性能:一个拥有大量多边形(比如100万个)的模型就很可能会导致出现性能“尖峰",原因在就于其它侧面所花费的渲染时间要少得多。

延迟通道(渲染不透明对象)

所有的不透明几何体都会在该通道中被渲染。经过此通道之后,引擎就生成了带有全部不透明几何体和散射的图像。

原生深度预置通道(Native Depth Pre-Pass)

GPU会为表面剔除执行深度测试。而图形API对低密度多边形网格进行的深度测试是非常快速的。

深度数据存储在深度缓冲区的纹理格式 (D16D24D32)中

填充缓冲区

在该渲染阶段,引擎会填充用于着色的G缓冲区。

Depth(深度)

深度缓冲区存储着当前视角(Field of View)下的场景对象(指的是可以在近端剪裁距离和远端剪裁距离之间找到的)。Objects(对象)是被渲染为纯几何模型后再存储进该缓冲区中的。

其纹理格式用的是RGBA8

  • RGB通道存储的是压缩的深度值。
  • A通道存储的是延迟透明通道的透明度。

引擎的深度缓冲区存储着压缩的深度(该缓冲区是线性的),而原生的深度缓冲区是非线性的。

Diffuse(漫反射)

Diffuse colors缓冲区存储着所有材质纹理的纯漫反射颜色:

其纹理格式用的是RGBA8

  • RGB通道存储的是漫反射颜色值。
  • A通道存储的是微纤维值。
注意
如果您不需要微纤维纹理,就可以将alpha值设置为0
Normal(法线)

Normal缓冲区存储着几何体每个顶点的法向量,而这对于计算合适的光照是必不可少的。

其纹理格式用的是RGBA8

  • RGB通道存储的是压缩的法线值(视图空间内)。
  • A通道存储的是光泽度值。
Specular(高光)

Specular缓冲区存储着场景中对象的高光值。

其纹理格式用的是RGBA8

  • RGB通道存储的是高光值。
  • A通道存储的是半透明值。

Translucency(半透明)是用来模拟光线透过对象(例如,叶子)的。

Velocity(速度)

Velocity缓冲区存储着每帧中像素位移的信息。当图像处于静止时,该缓冲区会被零(黑色)值填充。这些值对于启用随机采样抗锯齿(Temporal anti-aliasing (TAA))是必不可少的。

其纹理格式用的是RG16F

  • RG通道存储的是像素位移值(XY坐标系)。
警告
填充该缓冲区是强制性的!
Decal Mask(印花掩码)

Decal mask缓冲区存储着与印花有关的信息。

其纹理格式用的是R32U

  • R通道存储的是印花掩码值。
注意
使用控制台命令render_decals 0可禁用印花的渲染。
Light Map(光照贴图)

Light map缓冲区被用来将已烘焙的光照添加进场景。

其纹理格式用的是RGBA16F

  • RGB通道存储的是印花掩码值。
  • A通道存储的是表面环境光遮蔽(已烘焙)。

A通道存储的是已烘焙的表面环境光遮蔽,环境光遮蔽会与该通道共同发挥作用。

注意
使用控制台命令render_surface_ao 0可禁用表面AO的渲染(引擎将只使用RGB通道)。
使用控制台命令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(环境探针)的。

注意
为了能实现优化,就必须始终有1个world light(世界光)光源要在延迟复合(Deferred Composite)阶段进行渲染。
如果您使用了2个或更多个world light(世界光)光源,那么就要有1个world light(世界光)光源是始终在延迟复合阶段进行渲染的,而其它的光源则在本阶段中渲染。

Proj light光源纹理

Omni light光源纹理和Proj light光源纹理

所有光照都会被添加到要在延迟复合阶段应用的单一纹理上。

渲染延迟反射(Deferred Reflections)

在该渲染阶段,引擎会渲染所有已在相交(Intersections)阶段排序好的反射探针。

Environment Probe(环境探针)在其半径范围内应用了反射。

反射通道(Reflection Pass)

SSAO

屏幕空间环境光遮蔽(Screen-space Ambient Occlusion,简称SSAO)会渲染出其独有的纹理。该纹理也将被应用在延迟复合阶段。

SSR

屏幕空间反射(Screen-space Reflections,简称SSR)会渲染出其独有的纹理。该纹理也将被应用在延迟复合阶段。

散射(Scattering)

在该阶段,散射是借助之前在共用(Common)通道中获得的环境立方体贴图和LUT纹理来渲染的。

Scattering(散射)纹理

延迟复合(Deferred Composite)

在该阶段,引擎将利用步骤中以及通道中的所有必要纹理来创建带有不透明几何体的最终图像。

延迟复合的渲染是在Scattering(散射)纹理之上进行的

经渲染不透明几何体的延迟通道(Emission(自发光)通道除外)所生成的最终图像

注意
在延迟复合阶段,world light(世界光)纹理也会被渲染。

自发光(Emission)

待延迟复合图像创建后才会进入自发光通道。该通道将自发光效果应用在了延迟复合图像上。

应用了Emission(自发光)效果。

延迟通道(渲染透明对象)

该通道适用带给定延迟alpha融合透明度的材质。

在该延迟通道(渲染透明对象)内,渲染器会重复延迟通道(渲染不透明对象)中的每一步(步骤SSAOSSRDecals除外)。

透明对象是借助alpha融合,在不透明对象(延迟缓冲区)之上进行渲染的。此外,alpha值等于零的位置将不参与着色计算。

延迟通道(渲染透明对象)之后。

正向通道(渲染透明对象)

尽管Unigine是全延迟渲染引擎,但它仍然可以为透明对象选用正向渲染通道。

在正向通道(也包括渲染透明对象的延迟通道)内,渲染器是要填充延迟缓冲区的(目的是为了让正向透明对象参与后处理特效)。

Ambient Pass

光照通道(Light Passes)

填充延迟缓冲区

正向通道(渲染透明对象)之后。

随机采样抗锯齿(Temporal Anti-Anliasing)

当启用了TAA选项时才会使用该通道。否则,引擎将忽略该通道而直接进入下一阶段。

TAA技术是利用先前的帧来生成新的帧。

渲染后处理(Render Post)材质

引擎在该通道中生成渲染后处理(Render Post)材质的程序式纹理。而这些纹理则都是在启用了TAA之后被应用的。

Shadow Shafts(阴影光束)

引擎在该通道中使用阴影光束填充缓冲区。

摄像机效果

最终屏幕合成

后处理(Post)材质

延迟通道(Deferred Pass)

在延迟通道中只进行一次光栅化处理,目的是为了减小性能开销。 待该过程结束之后,光照会被渲染到基本缓冲区用以创建最终的场景图像。

注意
使用控制台命令render_show_textures可显示渲染器当前所用的一组缓冲区。

延迟通道优化

在延迟通道中,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(次表面散射)等等)。

您也可以编写自己的着色器,之后通过该缓冲区来应用您的自定义后处理。

Auxiliary buffer

带轮廓的辅助缓冲区

辅助色也可以用在色彩的叠加模式上(用来在主视窗对网格进行平面着色)。 根据辅助色的alpha通道的不同,可以对对象实现全着色渲染或半着色渲染:

Different auxiliary colors and transparency

辅助色被渲染在了屏幕上
最新更新: 2017-07-03
Build: ()