UE5 Shader基础学习笔记——13-20 DetailNormal/Smoothstep/Length/CeilFloorRound/DDXDDY/SinCos/Power

Posted 清清!

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了UE5 Shader基础学习笔记——13-20 DetailNormal/Smoothstep/Length/CeilFloorRound/DDXDDY/SinCos/Power相关的知识,希望对你有一定的参考价值。

UE5 Shader基础学习笔记——13-20 DetailNormal/Smoothstep/Length/CeilFloorRound/DDXDDY/SinCos/Power

本系列学习资料来源,Ben Cloward的油管空间,本笔记主要对其中UE的部分进行记录

Lec13 Detail Normal Mapping

使用Quixel的一个岩石资产(PkeeM)作为演示,拉太近之后纹理会比较模糊

可以使用Detail Normal增加细节,所谓Detail Normal就是再拿一张法线纹理,平铺很多次,进行法线混合覆盖在上面

Ben在视频中使用的DetailNormal如下,RG是法线,B是粗糙度,A是用于颜色Overlay的mask
由于有很多信息,所以在导入UE时使用BC7格式压缩,并且取消SRGB

使用如下

此时放大近看可以看到细节

不过这样是一直在计算DetailNormal,实际使用时为了让其不一直计算,可以在较低的Lod中舍弃这个,或者创建一个基于距离的mask,靠近时再计算

Lec14 Advanced Detail Mapping (etc.灰度mask)

在这节使用一张纹理mask将多个Detail进行映射
整个实现如下图,也就是RGBA四个通道各画一个Mask分别用不同的图


这样是消耗比较高的,于是可以用UE的TextureArray来改善,创建TextureArray后插入要用的图

采样TextureArray需要UVW三个参数,UV正常采样,W用于选择贴图
为了分出用什么贴图,可以在mask上使用不同灰度值,这样实现更加节省性能,W用灰度值映射


从评论中节选出一些问题

  • TextureArray会只加载一个mip,无法利用Streaming的优势,但对于detail来说没问题,毕竟detail只在特写中需要。Ben关于这个的建议是使用低分辨率的TextureArray,然后应用所有角色,一直在内存中也没事。
  • 关于如何在mask中单独设置每个纹理的UV平铺,如果使用了if节点来设置就没有意义了。
    Ben的回复是之前在开发圣歌的时候尝试做过但是这种尝试并不干净,他决定使用一个全局的统一的分辨率控制缩放。Ben提议可以将纹理缩放倍数也编码为灰度颜色读取,但是会在边界上产生一些奇怪的结果,在涉及纹理压缩和低mipmap时尤为明显。
    在圣歌的开发中,Ben让艺术家在一个mask上使用16种材质,texture array设置有16份贴图,分辨率为64*64
  • 如果想要使用mask之间过渡,可以采用最开始分通道存储mask的方式
  • 也有人提出问题,UE更适合多种材质插槽,使用多种简单的材质更好。Ben觉得使用一个材质可以减少DrawCall。

这种用灰度分mask的方法在其他游戏中也会用到,比如原神中根据不同灰度选择不同Ramp

Lec15 Smoothstep (etc.溶解/高度混合)

关于Smoothstep,可以看看
常用函数SmoothStep的实现原理
Shader实验室: smoothstep函数
推荐使用 Desmos这个网站 来画函数图像

SmoothStep(float edgo0,float edge1, float x);

edge0是样条线插值的下界,edge1是样条线插值的上界,当x小于下界返回0,当x大于上界返回1,介于上界下界之间返回一个平滑的曲线。

如下图对UV坐标在0.6和0.7之间Smoothstep

数学上就是这些,下面有一些例子,比如溶解

sin(time)映射到0~1,将噪声图在两个值之间Smoothstep,边缘有0.03厚度进行溶解


对溶解做一些改进,再加一组Smoothstep,但是稍微偏移一点,两者相减,溶解就只剩边缘了,有一种扫描的效果


还有个例子,Smoothstep也可以用在地形材质的高度混合
Building Worlds In Unreal 学习笔记——15-19 高度图地形专题&地形自动材质专题
首先拉一个渐变范围,然后让smoothstep去调整渐变的范围

Smoothstep对调整范围很有帮助,因为有最大值最小值可以控制

Lec16 Length & Distance (etc.摇摆/内部假光)

Length输入一个向量计算长度,Distance输入起止点计算长度,下图上下是等效的

下面这个例子将局部坐标Z值与下面的点计算距离作为遮罩,进行横向移动,达到摇摆的效果

下面的例子结构和摇摆的类似,不过这次将移动的sin作为测量距离的点,将距离pow之后作为自发光,得到一种虚假光源的效果


和sdf进行Ray Marching有类似的思路,通过描述距离来实现效果 案例学习——Unity体绘制shader初探

Lec17 Ceil Floor Round (etc.色阶)

Ceil 向上取整
Floor 向下取整
Round 四舍五入

举例 半兰伯特分色阶

Lec18 DDX DDY (etc.面片法线,纹理mip计算)

相邻像素之间求导

DDX和DDY叉乘可以得到法线,用于隐藏呈现面片感的树叶
UE4 Material 101学习笔记——30-37 植物叶片(透光/mask/面片隐藏/法线调整/AO/渐隐/世界空间色彩/随风舞动)

接着来DDXDDY还能修复HDR的latlong贴图


图片衔接处会有一个像素的白线,产生的原因是边界的不连续,交界处UV从0跳转到1,此时选择Mipmap出错,于是出现这个问题

解决办法选择Dericative模式作为MipValueMode,将UV坐标作为DDXDDY输入,对于极坐标等也很有帮助


在HLSL中,这个功能相当于 tex2Dgrad(s,t,ddx,ddy)函数 使用微分并指定MIP层的二维纹理查找

DDXDDY还能用于将凹凸贴图转为法线贴图,下面这些节点的功能相当于PerturbNormalLQ

Lec19 Sin Cos (etc.涟漪)

正弦余弦的定义不再赘述
注意在UE中,sin和cos的周期是1,需要自己在参数栏设置成2pi才会是正常的sin,cos的速度

sin和cos的使用这里ben佬给出了几个例子
第一个调整幅度

第二个则可以利用径向渐变来实现ripple


更进阶的ripple做法
UE4 Material 101学习笔记——13-18 完整的雨水着色器

第三个是用sin进行运动(加个sin就和弹跳动画一样)

第四个是旋转UV

Lec20 Power

幂运算的定义也不再赘述
power可以用于对比度调整,可以用于NdotV菲涅尔的调整,又比如power2.2和gamma校正一样
power性能比较昂贵,引擎也会做一些优化,比如二次方自动用硬编码的自身相乘替代

以上是关于UE5 Shader基础学习笔记——13-20 DetailNormal/Smoothstep/Length/CeilFloorRound/DDXDDY/SinCos/Power的主要内容,如果未能解决你的问题,请参考以下文章

UE5 Shader基础学习笔记——01-12 图形管线/创建shader/数学节点/贴图压缩/LerpDotUV/常用向量/坐标空间/MinMaxClampSaturate/法线贴图混合

UE5 Shader基础学习笔记——01-12 图形管线/创建shader/数学节点/贴图压缩/LerpDotUV/常用向量/坐标空间/MinMaxClampSaturate/法线贴图混合

UE5学习笔记——蓝图基础之基础节点知识

UE5学习笔记——蓝图基础之入门

UE5入门学习笔记——Gerstner波

unity shader学习笔记 shader基础结构以及Properties面板