力场着色器展开纹理不起作用
Force field shader unwrap texture not working
我忘记从某个地方得到这个着色器了,默认只对被击中的效果使用纯色。所以我试着修改它,让它也支持盾牌纹理。
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"
}
我这里用纹理替换了颜色
o.Albedo = tex2D(_MainTex, IN.uv_MainTex).rgb;//_ShieldColor.rgb;
但它不起作用,它显示为一种单一颜色,而不是周围的纹理。
问题出在 o.Aplha
。在您发布的着色器中,surf
returns Alpha 与纹理无关,因此您需要更改 surf
方法以根据纹理设置输出 Alpha。
可以这样做:
1) 替换
o.Albedo = tex2D(_MainTex, IN.uv_MainTex).rgb;//_ShieldColor.rgb;
和
// Read texture and set it to vector4
half4 c = tex2D(_MainTex, IN.uv_MainTex);
o.Albedo = c.rgb;
2) 插入
o.Alpha *= c.a;
之后
else {
o.Alpha = o.Alpha = _ShieldColor.a;
}
结果看起来像这样:
完整的结果着色器代码:
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"
}
我忘记从某个地方得到这个着色器了,默认只对被击中的效果使用纯色。所以我试着修改它,让它也支持盾牌纹理。
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"
}
我这里用纹理替换了颜色
o.Albedo = tex2D(_MainTex, IN.uv_MainTex).rgb;//_ShieldColor.rgb;
但它不起作用,它显示为一种单一颜色,而不是周围的纹理。
问题出在 o.Aplha
。在您发布的着色器中,surf
returns Alpha 与纹理无关,因此您需要更改 surf
方法以根据纹理设置输出 Alpha。
可以这样做:
1) 替换
o.Albedo = tex2D(_MainTex, IN.uv_MainTex).rgb;//_ShieldColor.rgb;
和
// Read texture and set it to vector4
half4 c = tex2D(_MainTex, IN.uv_MainTex);
o.Albedo = c.rgb;
2) 插入
o.Alpha *= c.a;
之后
else {
o.Alpha = o.Alpha = _ShieldColor.a;
}
结果看起来像这样:
完整的结果着色器代码:
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"
}