Shader实战(2):在unity中实现物体材质随时间插值渐变

目录

前言

一、shader代码

二、材质准备

三、控制代码


前言

最近想做一个物体两套材质随时间插值渐变的效果,本以为可以通过unity自带的Material.Lerp()实现,后来发现这个方法只适用于纯色的情况,其实与Color.Lerp()是同样的效果,后研究发现这个效果需要通过自定义shader来实现,因此记录如下

一、shader代码

新建一个shader名为TextureBlendShader

复制代码
Shader "Custom/TextureBlendShader"
{
    Properties
    {
        _StartTex ("Texture 1", 2D) = "white" {}
        _TargetTex ("Texture 2", 2D) = "white" {}
        _BlendAmount ("Blend Amount", Range(0, 1)) = 0
    }
    SubShader
    {
        Tags { "RenderType"="Opaque" }
        LOD 100

        Pass
        {
            CGPROGRAM
            #pragma vertex vert
            #pragma fragment frag
            #include "UnityCG.cginc"

            struct appdata_t
            {
                float4 vertex : POSITION;
                float2 uv : TEXCOORD0;
                float2 uv1 : TEXCOORD1;
            };

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

            sampler2D _StartTex;
            sampler2D _TargetTex;
            float _BlendAmount;

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

            half4 frag (v2f i) : SV_Target
            {
                // 在这里使用 lerp 函数对两个贴图进行插值
                half4 col1 = tex2D(_StartTex, i.uv1);
                half4 col2 = tex2D(_TargetTex, i.uv1);
                half4 finalColor = lerp(col1, col2, _BlendAmount);
                return finalColor;
            }
            ENDCG
        }
    }
}

二、材质准备

首先有两套渲染好的材质

新建材质,使用上一步自定义的shader,然后将对应的贴图附上去

三、控制代码

新建一个脚本名为TextureBlendController.cs

cs 复制代码
using UnityEngine;

public class TextureBlendController : MonoBehaviour {
    public Material materialWithShader; // 包含自定义Shader的材质
    public Texture targetTexture; // 目标贴图
    public float transitionSpeed = 1.0f; // 渐变速度

    private Material currentMaterial; // 当前材质
    private float blendAmount = 0.0f; // 渐变值

    void Start() {
        currentMaterial = GetComponent<Renderer>().material;
    }

    void Update() {
        // 在指定速度下进行渐变
        blendAmount += Time.deltaTime * transitionSpeed;
        blendAmount = Mathf.Clamp01(blendAmount); // 将值限制在0到1之间

        // 更新Shader中的 BlendAmount 变量
        currentMaterial.SetFloat("_BlendAmount", blendAmount);

        // 渐变完成后停止
        if (blendAmount >= 1.0f) {
            enabled = false; // 可以根据需求停止更新
        }
    }
}

将这个脚本挂到所有需要渐变的物体上,通过改变blendAmount可以控制前后两套材质的混合程度。

效果如下

相关推荐
辻弋2013 天前
五年前的旅行视频糊成马赛克?Video2X用Real-ESRGAN逐帧重建细节,但只支持Windows、集显用户建议直接放弃
服务器·数据库·windows·游戏引擎·电脑
三棵树园艺3 天前
室内仿真假山流水工程避坑指南|2026行业数据+材质测评+标准化施工全方案
材质
Martina_03213 天前
AI生成3D场景导入 Unity/Unreal 后,NPC 总串层?用6步检查导航高度与跨层连接
人工智能·游戏·数学建模·3d·unity·自然语言处理·aigc
小贺儿开发3 天前
Unity 局域网遥控幻灯片展示工具 3.0
科技·http·unity·工具·ppt·通信·网页
敲代码娶不了六花3 天前
Blender 3.6 Eevee 玻璃材质只反射世界环境,无法透视透明问题解析
blender·材质
Martina_03214 天前
AI生成的过山车轨道导入后频繁脱轨?用5步检查样条、轨距与碰撞
图像处理·人工智能·游戏·3d·材质·游戏策划·关卡设计
三棵树园艺4 天前
商业软装消防验收避坑技术复盘|仿真绿植阻燃等级国标规范、造假原理与落地解决方案(2026数据实测)
创业创新·材质
njsgcs5 天前
SIFU透明面片材质下载
材质
WarPigs5 天前
Unity对象不应该使用null传播的问题
unity
每日出拳老爷子6 天前
【VR】【Unity】抓走转放系列21|一天搭完门和抽屉工具槽:小场景按这个次序拼装
unity·vr·驱动·排错·snap zone