You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何制作闪烁着色器?实现GameObject从红色到白色反复淡变

实现红色到白色循环淡变的Shader方案

核心逻辑

利用Unity内置的时间变量结合pingpong函数生成0~1循环的插值因子,通过这个因子在红色与白色之间做颜色插值,就能实现反复淡变的效果。

完整Unlit Shader代码

直接替换你现有Shader的核心部分即可,这是一个基础的不透明Shader示例:

Shader "Custom/RedToWhitePulse"
{
    Properties
    {
        _PulseSpeed ("Pulse Speed", Range(0.1, 10)) = 1.0 // 可在Inspector调整淡变快慢
    }
    SubShader
    {
        Tags { "RenderType"="Opaque" }
        LOD 100

        Pass
        {
            CGPROGRAM
            #pragma vertex vert
            #pragma fragment frag

            #include "UnityCG.cginc"

            struct appdata
            {
                float4 vertex : POSITION;
                float2 uv : TEXCOORD0;
            };

            struct v2f
            {
                float2 uv : TEXCOORD0;
                float4 vertex : SV_POSITION;
            };

            float _PulseSpeed;

            v2f vert (appdata v)
            {
                v2f o;
                o.vertex = UnityObjectToClipPos(v.vertex);
                o.uv = v.uv;
                return o;
            }

            fixed4 frag (v2f i) : SV_Target
            {
                // 生成0~1循环的插值参数,_Time.y是游戏运行总时间
                float pulseFactor = pingpong(_Time.y * _PulseSpeed, 1.0);
                // 在红色和白色之间插值
                fixed3 red = fixed3(1, 0, 0);
                fixed3 white = fixed3(1, 1, 1);
                fixed3 finalColor = lerp(red, white, pulseFactor);
                return fixed4(finalColor, 1.0);
            }
            ENDCG
        }
    }
}

关键代码说明

  • pingpong(_Time.y * _PulseSpeed, 1.0):这个函数会让时间值在0到1之间来回循环,比如数值升到1后自动回落至0,再重新上升,刚好适配反复淡变的需求。
  • lerp(red, white, pulseFactor):根据循环的因子值线性过渡颜色,因子为0时是纯红色,因子为1时是纯白色,随着因子循环变化,颜色会在两者之间反复切换。
  • _PulseSpeed:暴露的可调参数,数值越大,淡变循环的速度越快,可直接在Unity Inspector面板修改。

如果是基于Standard光照Shader的修改

如果你原本的Shader带有光照计算(比如Standard Shader),只需要在片元着色器的最终颜色计算环节插入上述插值逻辑即可,示例如下:

// 在Standard Shader的片元函数中找到颜色计算部分,替换为:
fixed3 baseRed = fixed3(1, 0, 0); // 你的基础红色
float pulseFactor = pingpong(_Time.y * _PulseSpeed, 1.0);
fixed3 finalColor = lerp(baseRed, fixed3(1, 1, 1), pulseFactor);
// 将finalColor代入后续的光照计算流程

内容的提问来源于stack exchange,提问作者jasmine zhao

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 16:45:33