Unity-Technologies / Animation-Instancing

This technique is designed to instance Characters(SkinnedMeshRender).
Other
1.63k stars 296 forks source link

自定义shader,不能显示动画 #79

Open zzx110426 opened 4 years ago

zzx110426 commented 4 years ago

你好,我想问下,我不用surface,用自己定义的shader,添加了 #include "AnimationInstancingBase.cginc",但是不能正确显示动画,能否提供一个自定义shader的例子?

CloudJin commented 4 years ago

你有没有添加#pragma vertex vert这句话?

zzx110426 commented 4 years ago

// Upgrade NOTE: replaced 'UNITY_INSTANCE_ID' with 'UNITY_VERTEX_INPUT_INSTANCE_ID' // Upgrade NOTE: upgraded instancing buffer 'MyProperties' to new syntax.

Shader "AnimationInstancing/Cartoon-Skin" { Properties { _Color ("Color", Color) = (1, 1, 1, 1) _SkinBlendColor("Blend Color",Color) = (1,1,1,1)

    _SkinColor("Skin Color",Color) = (1,1,1,1)
    _ShardingColor("Shading Color",Color) = (1,1,1,1)
    _MainTex("Main Texture(Multiply)",2D) = "white"{}
    _NoseTex("Nose Texture",2D) = "white"{}
    _SubTex("Paint Texture",2D) = "black"{}
    _ShadowMapTex("ShadowMap Texture",2D) = "white"{}

    _Step("Shading Step", Range(-1.0,1.0)) = 0.0
    _LambartPower("LambartPower",Range(0.0 , 0.5)) = 0.2
    _RimLightPower("RimLight Power" , Range(0.0 , 1.0)) = 0.3
    _RimLightStep("RimLight Step", Range(0.0 , 1.0)) = 0.75
    _RimShadingStep("RimShading Step" , Range(0.0 , 1.0)) = 0.6
    _Outline("Outline size" , Float) = 0.0015
}

CGINCLUDE
    // Blending based script.
    float4 _SkinBlendColor;
ENDCG

SubShader{
    Tags{ "RenderType" = "Opapue" "IgnoreProjector"="True" }
    LOD 100

    // 0: Opaque pass
    Pass{
        Tags{"LightMode" = "ForwardBase"}

        Stencil {
            Ref 1
            Comp Always
            Pass Replace
        }

        CGPROGRAM

        #include "UnityCG.cginc"
        #include "AutoLight.cginc"
        #include "Lighting.cginc"
        #include "AnimationInstancingBase.cginc"

        #pragma vertex vert
        #pragma fragment frag
        #pragma multi_compile_fwdbase_fullshadows 
        #pragma multi_compile_instancing

        float4 _SkinColor;
        float4 _ShardingColor;
        sampler2D _MainTex; float4 _MainTex_ST;
        sampler2D _SubTex;
        sampler2D _MultiTex;
        sampler2D _ShadowMapTex;
        sampler2D _NoseTex; float4 _NoseTex_ST;

        float _Step;
        float _LambartPower;
        float _RimLightPower;
        float _RimLightStep;
        float _RimShadingStep;

        struct appdata 
        {
            float4 vertex : POSITION;
            float2 uv : TEXCOORD0;
            float2 uv2 : TEXCOORD4;
            float4 normal: NORMAL;
            float4 color: COLOR;
            UNITY_VERTEX_INPUT_INSTANCE_ID
        };

        struct v2f {
            float4 pos : SV_POSITION;
            float2 uv : TEXCOORD0;
            float3 normal : TEXCOORD1;
            float4 wpos : TEXCOORD2;
            float4 color : TEXCOORD3;
            float2 uv2 : TEXCOORD4;
            LIGHTING_COORDS(5,6)
            UNITY_VERTEX_INPUT_INSTANCE_ID
        };

        //UNITY_INSTANCING_BUFFER_START(Propss)
        //UNITY_DEFINE_INSTANCED_PROP(float4, _Color)
        //UNITY_INSTANCING_BUFFER_END(Propss)

        v2f vert(appdata v) {
            v2f o;

            UNITY_SETUP_INSTANCE_ID(v);
            UNITY_TRANSFER_INSTANCE_ID(v,o);

            o.pos = UnityObjectToClipPos(v.vertex);
            o.uv = TRANSFORM_TEX(v.uv, _MainTex);
            o.uv2 = v.uv2;
            o.normal = UnityObjectToWorldNormal(v.normal);
            o.color = v.color;
            o.wpos = mul(unity_ObjectToWorld, v.vertex);

            TRANSFER_VERTEX_TO_FRAGMENT(o);
            TRANSFER_SHADOW(o);
            return o;
        }

        fixed4 frag (v2f i) : SV_Target {
            //UNITY_SETUP_INSTANCE_ID(i);

            half3 viewDir = normalize(_WorldSpaceCameraPos.xyz - i.wpos.xyz);
            half3 normalDir = normalize(i.normal);      
            half3 lightDir = normalize(_WorldSpaceLightPos0.xyx);

            half4 shadowMask = tex2D(_ShadowMapTex, i.uv);       
            half4 col = tex2D(_MainTex, i.uv);
            half4 col2 = tex2D(_SubTex, i.uv);
            half4 nose = tex2D(_NoseTex, i.uv2);

            half NNdotV = 1 - dot(viewDir, normalDir);
            half Rim = step(NNdotV, _RimLightStep);
            half RimShadow = saturate(step(NNdotV, _RimShadingStep));

            half NdotL = max(-1, dot(normalDir, lightDir));
            half diffuse = step(NdotL, _Step);
            half4 Lambart = saturate((NdotL * 0.5 + 0.5)+ _LambartPower);
            half difShad = saturate(diffuse + ((1 - SHADOW_ATTENUATION(i)) * shadowMask) + (1 - RimShadow)+ (1 - Lambart));

            half4 blend = lerp(_SkinColor * _SkinBlendColor, col2, col2.a);
            half4 mixedcolor = lerp(blend, (_ShardingColor*blend), difShad );
            half4 finalcolor = (mixedcolor + ((1 - Rim) * _RimLightPower) * shadowMask) * col * nose * LIGHT_ATTENUATION(i) * _LightColor0 ;

            finalcolor.a = 1;
            return finalcolor;
            //return UNITY_ACCESS_INSTANCED_PROP(finalcolor);
            //return finalcolor * UNITY_ACCESS_INSTANCED_PROP(Propss, _Color);
        }
        ENDCG
    }

    // 1: Outline pass
    Pass{
        Stencil {
            Ref 1
            Comp Always
            Pass Replace
        }

        Cull Front

        CGPROGRAM
        #pragma vertex vert
        #pragma fragment frag
        #include "UnityCG.cginc"

        float _Outline;
        sampler2D _MainTex; float4 _MainTex_ST;

        struct appdata {
            float4 vertex : POSITION;
            float4 normal : NORMAL;
            float2 uv : TEXCOORD0;
            float4 color: COLOR;
        };

        struct v2f {
            float4 vertex : SV_POSITION;
            float2 uv : TEXCOORD0;
            float4 color : TEXCOORD3;
        };

        v2f vert(appdata v) {
            v2f o;
            v.vertex.xyz += v.normal.xyz * _Outline;
            o.uv = TRANSFORM_TEX(v.uv, _MainTex);
            o.vertex = UnityObjectToClipPos(v.vertex);
            o.color = v.color;
            return o;
        }

        half4 frag(v2f i) : SV_Target {
            half4 col = tex2D(_MainTex,i.uv);
            half4 finalcolor = col * 0.25;

            finalcolor.a = 1;
            return finalcolor;
        }
        ENDCG
    }
}

Fallback "Diffuse"

}

zzx110426 commented 4 years ago

很感谢您能回复我,上面我是我修改的一个卡通shader,里面包含了git上说的两段代码,在我的场景中,如果把instance的物体的材质换成本来就有的surface,就可以显示动画,但是如果换成我上面的那个材质,就没有动画了,能否告知下原因?

CloudJin commented 4 years ago

看你的shader,里面定义了自己的vs,所以才没有动画。 你把这个shader的vert()注释掉应该就有了。 如果你想使用自己的vert(),可以参考AnimationInstancingBase.cginc里的vert()来修改一个自己的版本。

zzx110426 commented 4 years ago

您好,我按照您说的把下面代码注释掉了,没有修改AnimationInstancingBase.cginc中的vert() //v2f vert(appdata v) { // v2f o;

// //UNITY_SETUP_INSTANCE_ID(v); // //UNITY_TRANSFER_INSTANCE_ID(v,o);

        //  o.pos = UnityObjectToClipPos(v.vertex);
        //  o.uv = TRANSFORM_TEX(v.uv, _MainTex);
        //  o.uv2 = v.uv2;
        //  o.normal = UnityObjectToWorldNormal(v.normal);
        //  o.color = v.color;
        //  o.wpos = mul(unity_ObjectToWorld, v.vertex);

// TRANSFER_VERTEX_TO_FRAGMENT(o); // TRANSFER_SHADOW(o); // return o; //}

运行场景后,出现一个破碎的剪影,这个剪影的动作是idle,是正确的,但是他的贴图不正确,大小位置也不正确,场景中,也会实例化对象,但是不能正常的显示动画 test

这是什么原因啊,如果您有时间的时候帮忙解惑下吧,迫切想用您的这个技术做个项目,谢谢了!!

CloudJin commented 4 years ago

你的shader里有2个pass,你是不是只注释掉了一个? 另外Outline pass这个pass也许要加上#include "AnimationInstancingBase.cginc"

zzx110426 commented 4 years ago

您说的那点,之前我自己也尝试过,也是不行,现在我重新定义了一个很简单的shader,出现的结果也是不正确的,目前,我没有修改"AnimationInstancingBase.cginc"中的任何东西,运行后,还是不显示动画,我很费解,我有尝试重新做Animation Generator,重新做AB build,重新BuildAssetBundle,还是不行,我有看到别人留言过,自己定义shader都成功了,我尝试了无数次了还是不行,真的很抱歉,又来请教您了 test 0813_1