UnityShader实现百叶窗效果

 更新时间:2019年11月30日 10:32:23   作者:猫叔压力大  
这篇文章主要为大家详细介绍了UnityShader实现百叶窗效果,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

本文实例为大家分享了UnityShader百叶窗展示的具体代码,供大家参考,具体内容如下

shader实现以上百叶窗效果,主要通过shader实现C#只是做开关控制

看到一篇文章弄的比较复杂,觉得可以都通过shader来实现,就动手了。

shader定义了2张texture,自己随便找2张图片拖进去就行。

Shader "Unlit/NewUnlitShader"
{
 Properties
 {
 _MainTex ("Texture", 2D) = "white" {}
 _MainTex2 ("Texture2", 2D) = "white" {}
 _StartFlag("开始标记", float) = 0
 _SpeedFactor("速度",Range(0.01,10)) = 0.1
 _StartTime("时间初始标记,不要手动设置",float) = 1
 _Column("百叶窗的列数",float ) = 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;
 float4 vertex : SV_POSITION;
 };
 
 sampler2D _MainTex;
 float4 _MainTex_ST;
 
 sampler2D _MainTex2;
 float4 _MainTex2_ST;
 
 float _StartFlag;
 float _Column;
 float _SpeedFactor;
 float _StartTime;
 
 v2f vert (appdata v)
 {
 v2f o;
 o.vertex = UnityObjectToClipPos(v.vertex);
 o.uv = TRANSFORM_TEX(v.uv, _MainTex);
 return o;
 }
 
 fixed4 frag (v2f i) : SV_Target
 {
 fixed4 col = 0;
 //_StartFlag 通过C#监听键盘事件,设置为1,作为开始动画的标记
 //step(a,b) => if(b>=a) return 1 else return 0
 //i.uv.x % (1/_Column) i.uv.x范围是0-1,分成_Column份 每份(1/_Column)
 fixed result = _StartFlag * step( i.uv.x % (1/_Column) ,(_Time.y - _StartTime) * _SpeedFactor );
 
 if( result == 0 )
 {
 col = tex2D(_MainTex, i.uv);
 }
 else
 {
 col = tex2D(_MainTex2, i.uv);
 }
 
 return col;
 }
 ENDCG
 }
 }
}

C#控制开关,点击键盘任意按键。挂到panel上

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
 
public class baiyechuang : MonoBehaviour {
 
 // Use this for initialization
 Material mat;
 MeshRenderer meshRen;
 void Start () {
 meshRen = this.GetComponent<MeshRenderer> ();
 print (meshRen);
 mat = meshRen.material;
 print (mat);
 }
 
 void OnGUI() {
 if (Input.anyKeyDown)
 {
  Event e = Event.current;
  if (e.isMouse) {
  Debug.Log(e.button);
  }
  if (e.isKey)
  {
  if (e.keyCode == KeyCode.None)
   return;
  Debug.Log(e.keyCode);
 mat.SetFloat ("_StartTime", Time.timeSinceLevelLoad);
 mat.SetFloat ("_StartFlag", 1);
  }
 }
 }
 
 
}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

您可能感兴趣的文章:

相关文章

  • Unity shader实现移动端模拟深度水效果

    Unity shader实现移动端模拟深度水效果

    这篇文章主要为大家详细介绍了Unity shader实现移动端模拟深度水效果,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-05-05
  • C#实现的SN快速输入工具实例

    C#实现的SN快速输入工具实例

    这篇文章主要介绍了C#实现的SN快速输入工具,以实例的形式详细讲述了C#实现序列号快速输入的方法,是非常实用的技巧,需要的朋友可以参考下
    2014-11-11
  • C#中的var关键字用法介绍

    C#中的var关键字用法介绍

    这篇文章介绍了C#中的var关键字用法,文中通过示例代码介绍的非常详细。对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-08-08
  • C# Onnx实现DIS高精度图像二类分割

    C# Onnx实现DIS高精度图像二类分割

    这篇文章主要为大家详细介绍了C# Onnx实现DIS高精度图像二类分割的相关知识,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下
    2023-11-11
  • 详解WPF如何在Panel中实现设置所有子项间距

    详解WPF如何在Panel中实现设置所有子项间距

    这篇文章主要为大家详细介绍了WPF如何在Panel中实现设置所有子项间距,本文借鉴了 Qt 中的 Spacing 设置方法,感兴趣的小伙伴可以跟随小编一起学习一下
    2024-10-10
  • C#实现按照指定长度在数字前补0方法小结

    C#实现按照指定长度在数字前补0方法小结

    这篇文章主要介绍了C#实现按照指定长度在数字前补0方法,实例总结了两个常用的数字补0的技巧,非常具有实用价值,需要的朋友可以参考下
    2015-04-04
  • C#中Dictionary<TKey,TValue>排序方式的实现

    C#中Dictionary<TKey,TValue>排序方式的实现

    这篇文章主要介绍了C#中Dictionary<TKey,TValue>排序方式的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-02-02
  • 详解LINQ入门(上篇)

    详解LINQ入门(上篇)

    这篇文章主要介绍了详解LINQ入门(上篇),文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-12-12
  • C#中如何限制TextBox控件内输入值的范围

    C#中如何限制TextBox控件内输入值的范围

    这篇文章主要介绍了C#中如何限制TextBox控件内输入值的范围,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-01-01
  • C#判断字符串中内容是否为纯数字的详细教程

    C#判断字符串中内容是否为纯数字的详细教程

    在进行C#编程时候,有的时候我们需要判断一个字符串是否是数字字符串,下面这篇文章主要给大家介绍了关于C#判断字符串中内容是否为纯数字的详细教程,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2023-04-04

最新评论