这个技巧适用于汽车游戏中的刹车灯、红绿灯等需要动态调节亮度的场景。核心思路是对 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 值下的自发光效果对比: