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性能比较昂贵,引擎也会做一些优化,比如二次方自动用硬编码的自身相乘替代