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"
}