Animation-Instancing icon indicating copy to clipboard operation
Animation-Instancing copied to clipboard

自定义shader,不能显示动画

Open zzx110426 opened this issue 5 years ago • 7 comments

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

zzx110426 avatar Oct 31 '19 03:10 zzx110426

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

CloudJin avatar Nov 04 '19 03:11 CloudJin

// 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 avatar Nov 04 '19 03:11 zzx110426

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

zzx110426 avatar Nov 04 '19 03:11 zzx110426

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

CloudJin avatar Nov 04 '19 06:11 CloudJin

您好,我按照您说的把下面代码注释掉了,没有修改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

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

zzx110426 avatar Nov 05 '19 08:11 zzx110426

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

CloudJin avatar Nov 05 '19 09:11 CloudJin

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

zzx110426 avatar Nov 06 '19 06:11 zzx110426