unity float4 examples emissive unity3d glsl hlsl

unity3d - float4 - unity surface shader emissive



Force shader unwrap texture no funciona (1)

Obtuve este sombreador de algún lado, lo olvidé, el valor predeterminado es solo usar el color sólido para el efecto que se está golpeando. así que trato de modificarlo para que sea compatible con la textura del escudo también.

Shader "TFTM/FX/Shield2" { Properties { _Position ("Collision", Vector) = (-1, -1, -1, -1) _MaxDistance ("Effect Size", float) = 40 _ShieldColor ("Color (RGBA)", Color) = (0.7, 1, 1, 0) _EmissionColor ("Emission color (RGBA)", Color) = (0.7, 1, 1, 0.01) _EffectTime ("Effect Time (ms)", float) = 0 _MainTex ("Texture (RGB)", 2D) = "white" {} } SubShader { Tags { "Queue" = "Transparent" "RenderType" = "Transparent" } LOD 2000 Cull Off CGPROGRAM #pragma surface surf Lambert vertex:vert alpha #pragma target 3.0 struct Input { float customDist; float2 uv_MainTex; }; sampler2D _MainTex; float4 _Position; float _MaxDistance; float4 _ShieldColor; float4 _EmissionColor; float _EffectTime; float _Amount; void vert (inout appdata_full v, out Input o) { o.customDist = distance(_Position.xyz, v.vertex.xyz); o.uv_MainTex = v.texcoord; } void surf (Input IN, inout SurfaceOutput o) { o.Albedo = tex2D(_MainTex, IN.uv_MainTex).rgb;//_ShieldColor.rgb; o.Emission = _EmissionColor; if(_EffectTime > 0) { if(IN.customDist < _MaxDistance){ o.Alpha = _EffectTime/500 - (IN.customDist / _MaxDistance) + _ShieldColor.a; if(o.Alpha < _ShieldColor.a){ o.Alpha = _ShieldColor.a; } } else { o.Alpha = _ShieldColor.a; } } else{ o.Alpha = o.Alpha = _ShieldColor.a; } } ENDCG } Fallback "Transparent/Diffuse" }

Reemplazo el color con textura aquí

o.Albedo = tex2D (_MainTex, IN.uv_MainTex) .rgb; // _ ShieldColor.rgb;

pero no está funcionando, aparece como un solo color en lugar de textura a su alrededor.


El problema es con o.Aplha . En el sombreado que publicaste, surf devuelve Alfa independientemente de la textura, por lo que debes cambiar el método de surf para establecer el resultado Alfa en función de la textura.

Se puede hacer de esta manera:

1) Reemplazar

o.Albedo = tex2D(_MainTex, IN.uv_MainTex).rgb;//_ShieldColor.rgb;

con

// Read texture and set it to vector4 half4 c = tex2D(_MainTex, IN.uv_MainTex); o.Albedo = c.rgb;

2) Insertar

o.Alpha *= c.a;

después

else { o.Alpha = o.Alpha = _ShieldColor.a; }

El resultado se ve así:

Código de sombreado de resultado completo:

Shader "TFTM/FX/Shield2" { Properties { _Position("Collision", Vector) = (-1, -1, -1, -1) _MaxDistance("Effect Size", float) = 40 _ShieldColor("Color (RGBA)", Color) = (0.7, 1, 1, 0) _EmissionColor("Emission color (RGBA)", Color) = (0.7, 1, 1, 0.01) _EffectTime("Effect Time (ms)", float) = 0 _MainTex("Texture (RGB)", 2D) = "white" {} } SubShader { Tags { "Queue" = "Transparent" "RenderType" = "Transparent" } LOD 2000 Cull Off CGPROGRAM #pragma surface surf Lambert vertex:vert alpha #pragma target 3.0 struct Input { float customDist; float2 uv_MainTex; }; sampler2D _MainTex; float4 _Position; float _MaxDistance; float4 _ShieldColor; float4 _EmissionColor; float _EffectTime; float _Amount; void vert(inout appdata_full v, out Input o) { o.customDist = distance(_Position.xyz, v.vertex.xyz); o.uv_MainTex = v.texcoord; } void surf(Input IN, inout SurfaceOutput o) { half4 c = tex2D(_MainTex, IN.uv_MainTex); o.Albedo = c.rgb;//_ShieldColor.rgb; o.Emission = _EmissionColor; if (_EffectTime > 0) { if (IN.customDist < _MaxDistance) { o.Alpha = _EffectTime / 500 - (IN.customDist / _MaxDistance) + _ShieldColor.a; if (o.Alpha < _ShieldColor.a) { o.Alpha = _ShieldColor.a; } } else { o.Alpha = _ShieldColor.a; } } else { o.Alpha = o.Alpha = _ShieldColor.a; } o.Alpha *= c.a; } ENDCG } Fallback "Transparent/Diffuse" }