欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

UnityShader实现百叶窗效果

程序员文章站 2023-10-31 13:01:58
本文实例为大家分享了unityshader百叶窗展示的具体代码,供大家参考,具体内容如下 shader实现以上百叶窗效果,主要通过shader实现c#只是做开关控制 看到一篇文...

本文实例为大家分享了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);
  }
 }
 }
 
 
}

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