Unlit Shader下的Texture切换

2023-11-10


今天要实现一个贴图切换过渡的一个效果,Unlit的性能比较好,所以参考了网上一些Texture的shader之后,写了一下。

具体内容:MixValue 来完成渐变效果, MixValue = 1时为下面的Texture, MixValue = 0时为上面的Texutrue
Shader
下面是shader的代码:主要是frag 部分,通过mixvalue去进行两个贴图的颜色混合

Shader "Unlit/SwapTexture"
{
    Properties
    {
        _MainTex ("Texture", 2D) = "white" {}
    _SubText("Texture", 2D) = "white"{}
    _MixValue("MixValue (Range)",Range(0,1)) = 0.5
  }
    SubShader
    {
        Tags { "RenderType"="Opaque" }
        LOD 100

        Pass
        {
            CGPROGRAM
            #pragma vertex vert
            #pragma fragment frag
            // make fog work
            #pragma multi_compile_fog

            #include "UnityCG.cginc"

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

            struct v2f
            {
                float2 uv : TEXCOORD0;
                UNITY_FOG_COORDS(1)
                float4 vertex : SV_POSITION;
            };

            sampler2D _MainTex;
      sampler2D _SubText;
      float _MixValue;
            float4 _MainTex_ST;

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

            fixed4 frag (v2f i) : SV_Target
            {
                // sample the texture
                fixed4 main = tex2D(_MainTex, i.uv);
        fixed4 sub = tex2D(_SubText, i.uv);
                // apply fog
        main = main * (1 - _MixValue);
        sub = sub * _MixValue;
        fixed4 col = main + sub;
                UNITY_APPLY_FOG(i.fogCoord, col);
                return col;
            }
            ENDCG
        }
    }
}

一个配套使用的脚本:挂在换贴图的物体上

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using System;
public class TextureSwapComp : MonoBehaviour {
  Renderer target;
  Shader shader;
  bool is_swaping;
  public int texture_index;
  // Use this for initialization
  private void Awake()
  {
    shader = Shader.Find("Unlit/SwapTexture");
    target = this.GetComponent<Renderer>();
    is_swaping = false;
  }

  private void Start()
  {
    ThemeManager.AddTextureSwap(this);
  }

  public void SwapTexture(Texture to, float time, Action action)
  {
    if (is_swaping) StopAllCoroutines();
    StartCoroutine(__Swap(to, time, action));
  }


  IEnumerator __Swap(Texture to, float time, Action action)
  {
    is_swaping = true;
    float timer = 0;
    float mix_value = 0;
    Material swaping_mat =  new Material(shader);
    Material currect_mat = target.material;

    swaping_mat.SetTexture("_MainTex", currect_mat.mainTexture);
    swaping_mat.SetTexture("_SubTex", to);
    swaping_mat.SetFloat("_MixValue", 0);
    target.material = swaping_mat;

    while (time >= timer)
    {
      timer += Time.deltaTime;
      mix_value = Mathf.Lerp(mix_value, 1, timer / time);
      swaping_mat.SetFloat("_MixValue", mix_value);
      yield return null;
    }

    currect_mat.SetTexture("_MainTex", to);
    target.material = currect_mat;

    currect_mat = null;
    swaping_mat = null;
    is_swaping = false;
    if (action != null) action();
  }

  private void OnDestroy()
  {
    StopAllCoroutines();
    ThemeManager.RemoveTextureSwap(this);
  }

  private void OnDisable()
  {
    StopAllCoroutines();
    ThemeManager.RemoveTextureSwap(this);
  }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Unlit Shader下的Texture切换 的相关文章

随机推荐

  • Python项目:The Ship Rendezvous Problem,利用贪心算法解决船舶交会问题

    提示 文章写完后 目录可以自动生成 如何生成可参考右边的帮助文档 Python利用贪心算法解决船舶交会问题 1 Introduction 2 Python Task Greedy Heuristic for the SRP Function
  • TCP/IP协议基础知识

    作者 QQ群 852283276 微信 arm80x86 微信公众号 青儿创客基地 B站 主页 https space bilibili com 208826118 参考 TCP IP详解卷1 协议 网络七层协议 Wireshark 分析p
  • E58F8D476F6F676C65E5B0B1E698AFE58F8DE4BABAE7B1BB

    111001101011001110111110111001101011100010101101111001101010111010001010111010011000000010010100111001001011100010000000
  • 二值图像与灰度图像的区别

    二值图像 二值图像是指每个像素不是黑 就是白 其灰度值没有中间过渡的图像 这种图像又称为黑白图像 二值图像的每一个像素只有两个值0和1 其中0表示黑色 1表示白色 所以二值图都是长这样的 因为二值图每个像素只有两个值 所以每个像素只需要1b
  • 【整理】BIOS、BootLoader、uboot对比

    bios BIOS是英文 Basic Input Output System 的缩略语 直译过来后中文名称就是 基本输入输出系统 其实 它是一组固化到计算机内主板上一个ROM芯片上的程序 它保存着计算机最重要的基本输入输出的程序 系统设置信
  • Flutter ListView ListView.build ListView.separated

    理解为ListView 的三种形式吧 ListView 默认构造 但是这种方式创建的列表存在一个问题 对于那些长列表或者需要较昂贵渲染开销的子组件 即使还没有出现在屏幕中但仍然会被ListView所创建 这将是一项较大的开销 使用不当可能引
  • 在多态中,析构函数中的virtual与override用法介绍

    在C 中 析构顺序总是先析构派生类 再析构基类 介绍 如果基类的析构函数没有声明为virtual 当使用基类指针 或引用 删除派生类对象时 可能只会调用基类的析构函数 而不会调用派生类的析构函数 这会导致派生类的资源没有被正确释放 从而产生
  • JavaScript reduce()方法详解与实现

    使用方法详解 reduce 方法在数组的每个元素上依次执行传入的 reducer 回调函数 并传入上一次计算的返回值 第一次运行回调函数的时候没有 上一次计算的返回值 调用reduce 方法的时候可以传一个初始值来代替 否则 数组的第一个元
  • MNIST数据集转换为图片数据集的样例程序

    一 编写背景 因为需要对接一个官方的编程API 本人需要自己按其要求搭建一个神经网络 以尝试调用某模块的工作 我参考了Tensorflow的参考书了解了MNIST数据集 然后我准备把MNIST数据集转换为图片格式 以适应API的要求 同样
  • 单片机笔记八:华大单片机报错(未定义__WEAKDEF)

    最近开始用华大的单片机 按照官方的例程做了一个工程模板 结果直接编译不过 而且一口气有30个错误 提示内容如下 WEAK void I2c0 IRQHandler void mcu common interrupts hc32l13x c
  • JavaSE——StringBuffer与StringBuilder拼接字符串详细解释

    目录 一 基本了解 1 1使用字符串频繁拼接会出现什么问题 1 2 了解StringBuffer 1 3 了解StringBuilder 1 4 StringBuffer与StringBuilder的区别 二 StringBuffer的使用
  • 额外函数_强化学习奖励函数塑形简介(The reward shaping of RL)

    RL背景 强化学习解决定义在马尔科夫过程 Makov Decision Processing MDP 下的连续决策问题 其中经典算法Q learning使用如下方程更新 值 策略 在状态s下采取行为a后的累计回报数学期望 Cumulated
  • C/C++使用libcurl库发送http请求(get和post可以用于请求html信息,也可以请求xml和json等串)

    C C 使用libcurl库发送http请求 get和post可以用于请求html信息 也可以请求xml和json等串 C 要实现http网络连接 需要借助第三方库 libcurl使用起来还是很方便的 环境 win32 vs2015 如果要
  • python基础(1)--对象、类、方法、库、函数

    几个概念的简单辨析 对象与类 一个独立的事物称为一个对象 对象具有一定的属性和功能 对象 属性 特征 方法 行为 类是对象的抽样化 类是对象的实例化 方法与函数 函数 通过 函数名 的方式进行调用 内置函数 匿名函数 递归函数 自定义函数等
  • R语言的排列组合函数:排列函数(permutations)和组合函数(combinations)

    R语言的排列组合函数 排列函数 permutations 和组合函数 combinations 排列函数 permutations 和组合函数 combinations 是R语言中用于处理排列和组合问题的常用函数 它们可以帮助我们生成和计算
  • 微信小程序开发(九):使用扩展组件库

    前端开发中离不开各种组件库 我最先接触的组件库还是Bootstrap 后来工作中又陆续使用了inoic ng zorro等各种不同的库 在微信小程序开发中也有多种组件库 这里记录其中几种不同组件库的使用方法 WeUI 这是微信官方推出的一款
  • 2023版golang面试题100道(合集)

    我已经从事后端开发很多年 近期花了大量时间整理了一份 golang面试题100道 涵盖了go开发需要掌握的基础知识 核心要点 题目的答案尽量做到简洁 条理性 golang面试题100道 最新完整合集目录 欢迎关注 回复 面试 即可随时阅读
  • MATLAB 判断字符串中是否含有特定的字符

    这个程序的目的是 逐行读取file txt文件中的字符串 并判断字符串中是否含有特定的字符 如果含有 再对字符串进行处理 然后写入到新的TXT文档中new file txt fid fopen D new file txt wt phns
  • 【好文鉴赏】初创公司到底值不值得去?从以下几点考虑

    关键词 初创公司 职业发展 就业 原文链接 https tech sina cn csj 2018 09 10 doc ihiixyeu5565677 d html https www zhihu com question 31272586
  • Unlit Shader下的Texture切换

    今天要实现一个贴图切换过渡的一个效果 Unlit的性能比较好 所以参考了网上一些Texture的shader之后 写了一下 具体内容 MixValue 来完成渐变效果 MixValue 1时为下面的Texture MixValue 0时为上