[Unity] 残影 shader 可能采样错误的问题,建议使用粒子系统代替,或者其他残影实现思路

328 阅读1分钟

残影 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 在固定位置有显示

可能出现的问题

某些图片可能采样失败

例如:

图片.png

这个图片是 64*64

图片.png

然后我又换了一个 512 * 512 的图片

图片.png

又有问题

我暂时还不知道为什么会产生这样的差别……每个图片都有点不太一样

比如第一个图片我看上去像是精度问题,第二个图片看上去像是顶点偏移有一个固定的误差,导致了一个交错

看了一下别人都是用粒子系统实现的 justenyc.medium.com/creating-a-…

然后 3d 残影的话可以看 blog.csdn.net/qq992817263…