当前位置:   article > 正文

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

unity 数值渐变

目录

前言

一、shader代码

二、材质准备

三、控制代码


前言

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

一、shader代码

新建一个shader名为TextureBlendShader

  1. Shader "Custom/TextureBlendShader"
  2. {
  3. Properties
  4. {
  5. _StartTex ("Texture 1", 2D) = "white" {}
  6. _TargetTex ("Texture 2", 2D) = "white" {}
  7. _BlendAmount ("Blend Amount", Range(0, 1)) = 0
  8. }
  9. SubShader
  10. {
  11. Tags { "RenderType"="Opaque" }
  12. LOD 100
  13. Pass
  14. {
  15. CGPROGRAM
  16. #pragma vertex vert
  17. #pragma fragment frag
  18. #include "UnityCG.cginc"
  19. struct appdata_t
  20. {
  21. float4 vertex : POSITION;
  22. float2 uv : TEXCOORD0;
  23. float2 uv1 : TEXCOORD1;
  24. };
  25. struct v2f
  26. {
  27. float2 uv : TEXCOORD0;
  28. float2 uv1 : TEXCOORD1;
  29. float4 vertex : SV_POSITION;
  30. };
  31. sampler2D _StartTex;
  32. sampler2D _TargetTex;
  33. float _BlendAmount;
  34. v2f vert (appdata_t v)
  35. {
  36. v2f o;
  37. o.vertex = UnityObjectToClipPos(v.vertex);
  38. o.uv = v.uv;
  39. o.uv1 = v.uv1;
  40. return o;
  41. }
  42. half4 frag (v2f i) : SV_Target
  43. {
  44. // 在这里使用 lerp 函数对两个贴图进行插值
  45. half4 col1 = tex2D(_StartTex, i.uv1);
  46. half4 col2 = tex2D(_TargetTex, i.uv1);
  47. half4 finalColor = lerp(col1, col2, _BlendAmount);
  48. return finalColor;
  49. }
  50. ENDCG
  51. }
  52. }
  53. }

二、材质准备

首先有两套渲染好的材质

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

三、控制代码

新建一个脚本名为TextureBlendController.cs

  1. using UnityEngine;
  2. public class TextureBlendController : MonoBehaviour {
  3. public Material materialWithShader; // 包含自定义Shader的材质
  4. public Texture targetTexture; // 目标贴图
  5. public float transitionSpeed = 1.0f; // 渐变速度
  6. private Material currentMaterial; // 当前材质
  7. private float blendAmount = 0.0f; // 渐变值
  8. void Start() {
  9. currentMaterial = GetComponent<Renderer>().material;
  10. }
  11. void Update() {
  12. // 在指定速度下进行渐变
  13. blendAmount += Time.deltaTime * transitionSpeed;
  14. blendAmount = Mathf.Clamp01(blendAmount); // 将值限制在0到1之间
  15. // 更新Shader中的 BlendAmount 变量
  16. currentMaterial.SetFloat("_BlendAmount", blendAmount);
  17. // 渐变完成后停止
  18. if (blendAmount >= 1.0f) {
  19. enabled = false; // 可以根据需求停止更新
  20. }
  21. }
  22. }

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

效果如下

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/羊村懒王/article/detail/107244
推荐阅读
相关标签
  

闽ICP备14008679号