这个技巧适用于汽车游戏中的刹车灯、红绿灯等需要动态调节亮度的场景。核心思路是对 SurfaceOutput 的 Emission 属性乘以一个可调系数,从而控制自发光的强弱。
C# 控制脚本
通过 C# 脚本在运行时向 Shader 传递颜色和强度参数:
public class NewBehaviourScript : MonoBehaviour {
public Material _m;
public float _intensity;
public Color _color;
// Use this for initialization
void Start () {
_m = GetComponent<Renderer>().material;
}
void Update()
{
_m.SetColor("_color", _color);
_m.SetFloat("_instensity", _intensity);
}
}
表面着色器 Shader
在表面着色器中,将 Albedo 颜色与 _intensity 相乘后赋给 Emission,实现可控的自发光效果:
Shader "Custom/NewShader" {
Properties {
_MainTex ("Base (RGB)", 2D) = "white" {}
_color("color",Color)=(1,1,1)
_v("vector",vector)=(92,2,2,2)
_intensity("_intensity",Range(0,5))=0
}
SubShader {
Tags { "RenderType"="Opaque" }
LOD 200
CGPROGRAM
#pragma surface surf Lambert
sampler2D _MainTex;
float3 _color;
float4 _v;
float _intensity;
struct Input {
float2 uv_MainTex;
};
void surf (Input IN, inout SurfaceOutput o) {
half4 c = tex2D (_MainTex, IN.uv_MainTex);
// _intensity=0.5;
c.rgb=_color;
o.Albedo = c.rgb;
o.Emission=o.Albedo*_intensity;
}
ENDCG
}
FallBack "Diffuse"
}
效果展示
以下是不同 _intensity 值下的自发光效果对比: