Animation-Instancing
Animation-Instancing copied to clipboard
自定义shader,不能显示动画
你好,我想问下,我不用surface,用自己定义的shader,添加了 #include "AnimationInstancingBase.cginc",但是不能正确显示动画,能否提供一个自定义shader的例子?
你有没有添加#pragma vertex vert这句话?
// 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"
}
很感谢您能回复我,上面我是我修改的一个卡通shader,里面包含了git上说的两段代码,在我的场景中,如果把instance的物体的材质换成本来就有的surface,就可以显示动画,但是如果换成我上面的那个材质,就没有动画了,能否告知下原因?
看你的shader,里面定义了自己的vs,所以才没有动画。 你把这个shader的vert()注释掉应该就有了。 如果你想使用自己的vert(),可以参考AnimationInstancingBase.cginc里的vert()来修改一个自己的版本。
您好,我按照您说的把下面代码注释掉了,没有修改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,是正确的,但是他的贴图不正确,大小位置也不正确,场景中,也会实例化对象,但是不能正常的显示动画
这是什么原因啊,如果您有时间的时候帮忙解惑下吧,迫切想用您的这个技术做个项目,谢谢了!!
你的shader里有2个pass,你是不是只注释掉了一个? 另外Outline pass这个pass也许要加上#include "AnimationInstancingBase.cginc"
您说的那点,之前我自己也尝试过,也是不行,现在我重新定义了一个很简单的shader,出现的结果也是不正确的,目前,我没有修改"AnimationInstancingBase.cginc"中的任何东西,运行后,还是不显示动画,我很费解,我有尝试重新做Animation Generator,重新做AB build,重新BuildAssetBundle,还是不行,我有看到别人留言过,自己定义shader都成功了,我尝试了无数次了还是不行,真的很抱歉,又来请教您了