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