NoiseFloor 发表于 2022-11-29 14:50

unity shader ASE-全息投影

全息投影
闪烁、扫描/扫光、边缘光、线框模式、信号干扰
全息投影Holographic
ASE-surface
Light Model=Unlit
Blend Mode=Transparent再=Custom
基础自发光颜色
Emission=MainColor.RGBA
Opacity=MainColor.A闪烁效果

Emission=MainColor.RGBA*Noise.R
Noise.UV=Texture Coordinates.UV+Time

作者换另一种实现方案,替换了Noise.R为Noise Generator
x=Transform Position.X+Y+Z
x=Scale And Offset(x,200,Offset:Time=15)
x=Append(x,Time=0.5)
Noise Generator.UV=x

对Noise Generator优化,作者说没理论支持,来自个人经验,看作者的大部分视频基本是来自经验积累的效果实现
x=Remap(x),设置Min New=-0.5,Max New=2
Flicking=Clamp(x,0,1)

半透明光影前后重叠问题
设置变量ZWriteMode,Auto-Register=true,Attributes-Toggle=true,修改Depth里的ZWrite Mode=ZWriteMode
边缘光

FresnelFactor=Max(Fresnel,0),Fresnel设置Safe Power=true
Fresnel.World Normal=World Normal.XYZ,RimBias=0,RimScale=1,RimPower=2
World Normal.Normal=NormalMap.XYZ,NormalMap设置Unpack Normal Map=true
线框

WireFrame=(Tex)WireFrame.R*WireFrameIntensity
综合闪烁、边缘光、线框

x=MainColor.RGBA+MainColor.RGBA*FresnelFactor
Emission=x*Flicking
x=MainColor.A+FresnelFractor
x=Clamp(x,0,1)
Opacity=x*WireFrame

添加控制闪烁强度的变量FlickControl
Flicking=Lerp(A:1,B:Flicking,Alpha:FlickControl:),FlickControl=0时,Flicking=1不闪烁,1时值最大,起到控制效果
添加控制透明度的变量Alpha
Opacity=Opacity*Alpha:
扫光

相对坐标x=World Position.Y-Transform Position.Y
x=x*ScanlineTilling
x=x+Time,Time.Scale=ScanlineSpeed
这里有几种方式实现扫光Scanline
Scanline=Sin(x)
Scanline=Fract(x)
Scanline=ScanlineTex.R,一张黑白渐变贴图,ScanlineTex.UV=Append(X:0.5,Y=x)
作者用第三种,添加控制方式,x=ScanlineTex.R-ScanlineInvert:,Scanline=x*ScanlinePowerASE内置函数制作,扫光效果

目录右键-Create-Amplify Shader Function-Scanline
复制上面的扫光代码,将值输出到Output
将变量替换成Function Input,可设置Default Value
相对坐标x=World Position.Y-Transform Position.Y后需要连一个(Function Input)Position
乘与加效果可以用一个函数Scale And Offset替换
ScanlineTex需要一个输入变量,设置Input Type=Sampler 2D
点击空白位置,可调整Function Inputs里变量的顺序

搞两个Scanline,分别设置变量,其中ScanlineTex=Texture Object
设置Scanline1的输出,ScanlineColor=Scanline1*ScanlineColor,ScanlineAlpha=Scanline1*Line1Alpha(实践看Line1Alpha效果不大)
综合闪烁、边缘光、线框、扫光

x=MainColor.RGBA+MainColor.RGBA*FresnelFactor+Max(ScanlineColor,0)
Emission=x*Flicking
x=MainColor.A+FresnelFractor+ScanlineAlpha
x=Clamp(x,0,1)
Opacity=x*WireFrame*Alpha:

第二段扫描线效果不明显不加了。。信号干扰/故障效果

x=Scale And Offset(World Position.Y,Scale:GlicthTilling=3,Offset:Time=-2.5)
x=Append(X:x,Y:Time=-2)
x=Noise Generator,Noise Generator.UV=x
x=Scale And Offset(x,Scale:2,Offset:-1)
GlitchVertexOffset=VertexOffset.XYZ*0.01*x

Local Vertex Offset=GlitchVertexOffset故障效果只在正视图有效,左视图无效,需要对VertexOffset坐标进行转换Transform Direction(View to Object)
隐藏内部结构,设置Extra Depth Pass=true,会出现破破烂烂的效果
看了代码,第1个Pass
Pass
{
ColorMask 0
ZWrite On
}
没看懂,作者说是这段代码就是预先写深度,这个Pass里面没有任何的数据,所以出现问题

解决方式:
复制角色,shader以及material,命名为xxx_DepthMask,如其名,深度遮罩Mask
Mask里除了Local Vertex Offset外,其余都删了,默认开启ZWrite Mode=On
然后原先的shader设置Render Queue=3001

又出现透明度处理错误的问题,被透明光束挡住了。
关闭DepthMask的阴影以及光线吸收
设置Skinned Mesh Renderer-Lighting-Cast Shadows=Off,Receive Shadows=false
显示背面的光束(剔除正面CullMode=Front)先渲染Render Queue=2998
DepthMask的角色设置Render Queue=2999第二个渲染
正常角色设置Render Queue=3000第三个渲染
显示正面的光束(剔除反面CullMode=Back)设置Render Queue=3001第4个渲染
页: [1]
查看完整版本: unity shader ASE-全息投影