【Heskey带你玩渲染】UE材质系统
作者:互联网
本文禁止转载
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
- 压缩格式:
BC/DXT(C)用于PC上的DirectX. (Block Compression/DirectX Texture Compression)
- 压缩类型:
每种压缩格式都有多种压缩类型,如:BC1, BC3, BC5, BC7, DXTC1, DXTC3, DXTC5
BC3,DXTC5表示含透明(alpha)的纹理,存储但不会对alpha通道压缩
BC1,DXTC1表示不含透明的纹理
VectorDisplacementmap(BAG8R8A8)表示未压缩,观察压缩后的大小,它是压缩等级的最佳指标。
- 其它压缩选项:
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
标签:结点,渲染,压缩,纹理,UE,材质,Heskey,着色器,光照 来源: https://www.cnblogs.com/Heskey0/p/16500498.html