残影 shader
参照 zhuanlan.zhihu.com/p/267343737 制作的在固定位置显示残影的 shader
Shader "Unlit/GhostAtFixedPos" {
Properties {
_MainTex ("Main Tex", 2D) = "white" {}
_GhostOffset ("Ghost Offset", Vector) = (0, 0, 0, 0)
_HaveGhost ("Have Ghost", float) = 0
}
CGINCLUDE
#include "UnityCG.cginc"
sampler2D _MainTex;
float4 _GhostOffset;
float _HaveGhost;
struct v2f {
float4 pos : POSITION;
float2 uv : TEXCOORD0;
};
v2f vert_normal(appdata_base v) {
v2f o;
o.pos = UnityObjectToClipPos(v.vertex);
o.uv = v.texcoord;
return o;
}
// 残影的顶点着色器
// 这里主要是修改了 pos 对于每一个原来的顶点位置都加一个偏移
v2f vert_offset_1(appdata_base v) {
v2f o;
float4 pos = mul(unity_ObjectToWorld, v.vertex);
o.pos = mul(UNITY_MATRIX_VP, pos + _GhostOffset);
o.uv = v.texcoord;
return o;
}
// 正常精灵的片元着色器
float4 frag_normal(v2f i) : COLOR {
return tex2D(_MainTex, i.uv);
}
// 残影的片元着色器
float4 frag_color(v2f i) : COLOR {
float4 c;
c = tex2D(_MainTex, i.uv);
c.w = _HaveGhost;
return c;
}
ENDCG
SubShader {
Pass { // 渲染残影
ZWrite Off
Blend SrcAlpha OneMinusSrcAlpha
CGPROGRAM
#pragma vertex vert_offset_1
#pragma fragment frag_color
ENDCG
}
Pass { // 渲染自身,这时要开启 ZWrite
Blend SrcAlpha OneMinusSrcAlpha
CGPROGRAM
#pragma vertex vert_normal
#pragma fragment frag_normal
ENDCG
}
}
FallBack "Diffuse"
}
使用时只需要在 update 中设置物体到固定位置的 _GhostOffset 就可以实现残影 pass 在固定位置有显示
可能出现的问题
某些图片可能采样失败
例如:
这个图片是 64*64 的
然后我又换了一个 512 * 512 的图片
又有问题
我暂时还不知道为什么会产生这样的差别……每个图片都有点不太一样
比如第一个图片我看上去像是精度问题,第二个图片看上去像是顶点偏移有一个固定的误差,导致了一个交错
看了一下别人都是用粒子系统实现的 justenyc.medium.com/creating-a-…
然后 3d 残影的话可以看 blog.csdn.net/qq992817263…