如何制作闪烁着色器?实现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
相关产品推荐
相关产品推荐

