• 欢迎光临~

【Heskey带你玩渲染】UE材质系统

开发技术 开发技术 2022-07-21 次浏览

本文禁止转载
B站:Heskey0

Part 1 : 底层原理

【整体架构】

1.实时渲染的运作方式:

使用HLSL写代码,其中部分关键变量处于未定义状态(使用何种纹理)。

着色器的作用是定义功能(包括定义精确数值:反射度高低,亮度,纹理),然后在编辑器中对这些变量进行定义。

2.虚幻的运作方式:

写HLSL(模板着色器),材质编辑器随后会使用此处的代码,将其与编辑器中的结果相结合,随后自行生成另一个着色器(实际将要使用的HLSL着色器)。材质实例系统会利用并定义着色器中未定义的值。

材质结点有两部分,接受输出的BasicPBR结点和产生输入的其它结点(材质图表)。

BasicPBR结点输出结果主要受到使用模板的着色器影响。

使用的模板着色器取决于基础材质的细节面板设置(例如Surface, Opaque, UnLit)

3.shader permutation:

因为每一种用例都需要某种特定方式的渲染,在一个着色器内无法支持过多功能,所以生成的着色器必须支持各种permutation。虚幻引擎自动生成的每个材质创建许多不同版本

例如:若已经生成了着色器,而物体采用静态光照,并且已经生成光照贴图,那么,之前的着色器的代码不具备混合光照贴图的功能,所以会追加一段代码。这将导致虚幻引擎对着色器进行编译(Compiling Shaders xxxx),这个过程就是生成材质的permutation。

permutation可以由材质编辑器细节面板中的Usage来控制,也会由材质图表的Switch结点产生,能由ProjectSettings中的Shader Permutation Reduction选项设置

只是打开了某些资源,虚幻却提示用户保存某些已修改的资源:

勾选Automatically Set Usage in Editor时,引擎会自动决定Usage,所以会提示保存生成的permutation

如果不能正确设置Usage,那么编辑器中能运行,而打包后可能出现材质丢失

【性能】

着色器性能受到顶点数和在屏幕上覆盖的像素数影响,alt+8显示shader复杂度

1.半透明开销大的原因:

①每个半透明层反复重新计算每个像素。

②难以理清半透明表面的排序顺序。

2.材质性能提升:
  • Feature Level Switch结点

    ​ 会根据所使用的着色器模型来提取不同的输入。大部分计算机能处理SM5 (Shader Model 5),IOS可以使用ES2或ES3。那么就可以使用简化的材质设置,对于移动设备可以使用简单的材质设置。

  • Quality Switch结点

  • Fully Rough属性

    ​ 会移除部分PBR

  • Shader Permutations (Project Settings)

  • Texture Group sizes

【纹理:压缩和内存】

纹理是在导入时进行压缩的,默认情况下,始终对纹理进行压缩

引擎内部存储两种图

①在导入时自动解压所有图片格式(bmp,png)存成无损

②根据设置将这张无损图压缩成另一张图

压缩纹理的原因:

1.压缩方式:
window->statistics
  1. 压缩格式:
BC/DXT(C)用于PC上的DirectX. (Block Compression/DirectX Texture Compression)
  1. 压缩类型:

每种压缩格式都有多种压缩类型,如:BC1, BC3, BC5, BC7, DXTC1, DXTC3, DXTC5

BC3,DXTC5表示含透明(alpha)的纹理,存储但不会对alpha通道压缩

BC1,DXTC1表示不含透明的纹理

VectorDisplacementmap(BAG8R8A8)表示未压缩,观察压缩后的大小,它是压缩等级的最佳指标

  1. 其它压缩选项:

Defer Compression延迟压缩:可以将压缩延迟到保存时,可以加快导入纹理的速度

Compress Without Alpha:纹理不含透明通道,压缩RGB

2.法线贴图:

使用特殊的BC5压缩,压缩会把蓝色移除,仅存储RG。

当法线贴图位于GPU上时,没有蓝色。

纹理不会影响FPS,纹理出问题,可能会导致纹理分辨率低,延迟,冻结,卡顿

【纹理池】

1.纹理预算(Texture Budget)

虚幻引擎将在内存中为纹理保留一定量的空间的过程。

2.纹理流送池(Texture Streaming Pool)

纹理预算预留的空间。纹理池的大小控制着实际用于要显示的纹理的空间量。(默认2GB)

控制台:
r.Streaming.PoolSize
配置文件:
MyProject->Config->DefaultEngine.ini
3.纹理流送(Texture Streaming)

确定在何种情况需要何种mipmap等级的纹理的过程。

4.mipmaps

大小为2的n次方的纹理才能生成mipmap。

5.Texture Group

是对纹理进行分类的一种方式,可以将一组纹理质量调低。

Mip Gen Settings和LOD Bias由Texture Group控制

纹理组组批量修改:
Window->Developer Tools->Device Profiles
6.共享采样器

每个材质有至多16个采样器的限制,除去光照贴图,阴影贴图等,一个材质包含13个纹理

应对方案:

①设置Texture Sampler结点的Sampler Source属性为Shared Wrap或Shared Group

②各通道存储不同的信息

Part 2 : 材质基础


【Shading Models】

1.Unlit:

“无光照”类似于“自发光”

Emissive Color

2.Subsurface:

Opacity:进入物体的光照的量

Subsurface Color

3.Subsurface Profile:

通过subsurface profile配置文件制造次表面散射的假象,根据配置文件中的参数模糊屏幕空间内的图像。

4.Two Sided Foliage:

模拟光线穿透树叶的效果

  • 对于植被,也要实现某种类型的“次表面散射”。”双面植被“是一种“次表面”效果,专注于处理植被

  • 在制作树木或者类似的植被时,树木由许多不同的平面组成,树叶都只是平面。

Opacity:进入物体的光照的量

Subsurface Color:穿透后产生的光颜色

5.Clear Coat

Clear Coat:是否启用

Clear Coat Roughness:

//Project Settings中可禁用此结点(Clear Coat Enable Second Normal)

Clear Coat Bottom Normal:提供一个输出,接收格外的法线贴图

【Blend Mode】

Blend Mode 用于对半透明度等设置进行控制

1.Translucent:
  • 由于GBuffer的限制,半透明表面难以显示反射,难以与一般光照和着色效果互动

  • 半透明材质尽可能使用无光照。(无光照与有光照差别小)

Translucency -> Lighting Mode:

选项自上到下等级升高
1.Volumetric NonDirectional
* 内部对面细分成块,对每个块进行光照

2.Volumetric PerVertex NonDirectional
* 对顶点进行光照,开销低
2.Masked
  • 蒙版材质中不可见的部分,实际上仍在进行渲染

Opacity Mask

DitherTemporalAA结点:

输出到Opacity Mask

通过将表面分为大量小型像素,每个像素都可见或不可见,来使其呈现半透明效果。

【Material Domain】

1.Decal
2.Light Function

将此材质与光照混合,使光照能够投射材质

  • 应用:水的涟漪,云的阴影
3.Volume
  • 应用:粒子系统的材质,可制作烟雾

【Material Layers】

是材质函数的变体

并非将一小组表达式放置到一个函数中,而是直接将整个材质放置到一种特殊类型的函数中,该函数称为材质图层

  • 勾选细节面板Use Material Attributes,会将末尾结点折叠成单一输入,实际的输入会来自Material Layer

    Blend Material Layers结点:将不同Material Layer混合在一起

    Set Material Attributes

  • Material Layer中的Input结点可以在材质使用时Override

【Material Parameter Collections】

  • 是一种”超级参数“,作用与常规材质参数相同

  • 属于全局参数,存在于整个项目中,适用于所有对象

  • 可以集中对其更改,其它对象都会自动应用更改

使用:创建Material Parameter Collections资产,在材质中使用collection parameter结点

【HLSL】

【其它特性】

1.Particle

结点:

  • Particle Color:支持驱动粒子编辑器中的颜色来修改材质,可实现淡入淡出

  • Particle Radius

  • Particle Position

  • Particle Direction

  • Particle Speed

  • Particle Relative Time

  • Particle Random Value

  • Particle Size

  • Particle Motion Blur Fade

  • Particle SubUV:允许生成子UV材质

2.Custom UVs

修改细节面板Num Customized UVs

结点:

  • VertexInterpolator:

顶点着色器导入,像素着色器导出

使用该功能可以将工作转交给顶点着色器,可以避免在像素着色器上调整缩放,缩放改为在顶点着色器上执行。对于“Custom UV”而言同样如此。这样可以为负担过重的像素着色器减轻负担。

在Custom UV结点连接UV,等同于UV连接VertexInterpolator之后正常输入Texture Sample

3.Blurring

是一类结点,材质编辑器中的所有Blurring相关结点(Montion Blur等),只不过是多次复制图像,偏移,改变透明度,分层堆叠

4.BlackBody

是一个结点,用于将”色温“(即光照温度,如2700开尔文为家用灯泡),转换为可供材质编辑器使用的颜色,输出连接到自发光。

5.Ambient Occlusion Mask
  • AO经过烘焙成为光照和阴影的一部分,以供材质编辑器读取,可以依据AO找到物体边缘位置

PrecomputedAOMask结点

6.Distance Field

//勾选Project Setting->Generate Mesh Distance Fields

//取消勾选Actor实例的Affect Distance Field Lighting

距离场是将三维数据打包到纹理中的一种特殊方式,由此可以产生距离场纹理

DistanceToNearestSurface

程序员灯塔
转载请注明原文链接:【Heskey带你玩渲染】UE材质系统
喜欢 (0)