Unityshader怎么實現(xiàn)百葉窗特效-創(chuàng)新互聯(lián)

這篇文章主要介紹“Unityshader怎么實現(xiàn)百葉窗特效”,在日常操作中,相信很多人在Unityshader怎么實現(xiàn)百葉窗特效問題上存在疑惑,小編查閱了各式資料,整理出簡單好用的操作方法,希望對大家解答”Unityshader怎么實現(xiàn)百葉窗特效”的疑惑有所幫助!接下來,請跟著小編一起來學習吧!

創(chuàng)新互聯(lián)客戶idc服務(wù)中心,提供雅安機房托管、成都服務(wù)器、成都主機托管、成都雙線服務(wù)器等業(yè)務(wù)的一站式服務(wù)。通過各地的服務(wù)中心,我們向成都用戶提供優(yōu)質(zhì)廉價的產(chǎn)品以及開放、透明、穩(wěn)定、高性價比的服務(wù),資深網(wǎng)絡(luò)工程師在機房提供7*24小時標準級技術(shù)保障。

1.將圖片劃分為水平N欄,代碼如下:

Shader "Unlit/BYCShader"{ Properties {  [PerRendererData] _MainTex ("Sprite Texture", 2D) = "white" {}  _Color ("Tint", Color) = (1,1,1,1)   _StencilComp ("Stencil Comparison", Float) = 8  _Stencil ("Stencil ID", Float) = 0  _StencilOp ("Stencil Operation", Float) = 0  _StencilWriteMask ("Stencil Write Mask", Float) = 255  _StencilReadMask ("Stencil Read Mask", Float) = 255   _ColorMask ("Color Mask", Float) = 15   _Lan("Lan",Float) = 10    [Toggle(UNITY_UI_ALPHACLIP)] _UseUIAlphaClip ("Use Alpha Clip", Float) = 0 }  SubShader {  Tags  {   "Queue"="Transparent"   "IgnoreProjector"="True"   "RenderType"="Transparent"   "PreviewType"="Plane"   "CanUseSpriteAtlas"="True"  }   Stencil  {   Ref [_Stencil]   Comp [_StencilComp]   Pass [_StencilOp]   ReadMask [_StencilReadMask]   WriteMask [_StencilWriteMask]  }   Cull Off  Lighting Off  ZWrite Off  ZTest [unity_GUIZTestMode]  Blend SrcAlpha OneMinusSrcAlpha  ColorMask [_ColorMask]   Pass  {   Name "Default"  CGPROGRAM   #pragma vertex vert   #pragma fragment frag   #pragma target 2.0    #include "UnityCG.cginc"   #include "UnityUI.cginc"    #pragma multi_compile __ UNITY_UI_CLIP_RECT   #pragma multi_compile __ UNITY_UI_ALPHACLIP    struct appdata_t   {    float4 vertex : POSITION;    float4 color : COLOR;    float2 texcoord : TEXCOORD0;    UNITY_VERTEX_INPUT_INSTANCE_ID   };    struct v2f   {    float4 vertex : SV_POSITION;    fixed4 color : COLOR;    float2 texcoord : TEXCOORD0;    float4 worldPosition : TEXCOORD1;    UNITY_VERTEX_OUTPUT_STEREO   };    v2f vert(appdata_t v)   {    v2f OUT;    UNITY_SETUP_INSTANCE_ID(v);    UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(OUT);    OUT.worldPosition = v.vertex;    OUT.vertex = UnityObjectToClipPos(OUT.worldPosition);     OUT.texcoord = v.texcoord;     OUT.color = v.color;    return OUT;   }    sampler2D _MainTex;    float _Lan;    float4 frag(v2f IN) : SV_Target   {    //從這裡開始    float2 uv = IN.texcoord;     uv.x*= _Lan;    uv.x = frac(uv.x);    return float4(uv.xy,1.0,1.0);   }  ENDCG  } }}

2.對每一欄同時進行顏色消減(控制閾值可以通過c#代碼實現(xiàn))

代碼如下:

Shader "Unlit/BYCShader"{ Properties {  [PerRendererData] _MainTex ("Sprite Texture", 2D) = "white" {}  _Color ("Tint", Color) = (1,1,1,1)   _StencilComp ("Stencil Comparison", Float) = 8  _Stencil ("Stencil ID", Float) = 0  _StencilOp ("Stencil Operation", Float) = 0  _StencilWriteMask ("Stencil Write Mask", Float) = 255  _StencilReadMask ("Stencil Read Mask", Float) = 255   _ColorMask ("Color Mask", Float) = 15   _Lan("Lan",Float) = 10   _StepX("StepX",Range(0.0,1.0))=1.0   [Toggle(UNITY_UI_ALPHACLIP)] _UseUIAlphaClip ("Use Alpha Clip", Float) = 0 }  SubShader {  Tags  {   "Queue"="Transparent"   "IgnoreProjector"="True"   "RenderType"="Transparent"   "PreviewType"="Plane"   "CanUseSpriteAtlas"="True"  }   Stencil  {   Ref [_Stencil]   Comp [_StencilComp]   Pass [_StencilOp]   ReadMask [_StencilReadMask]   WriteMask [_StencilWriteMask]  }   Cull Off  Lighting Off  ZWrite Off  ZTest [unity_GUIZTestMode]  Blend SrcAlpha OneMinusSrcAlpha  ColorMask [_ColorMask]   Pass  {   Name "Default"  CGPROGRAM   #pragma vertex vert   #pragma fragment frag   #pragma target 2.0    #include "UnityCG.cginc"   #include "UnityUI.cginc"    #pragma multi_compile __ UNITY_UI_CLIP_RECT   #pragma multi_compile __ UNITY_UI_ALPHACLIP    struct appdata_t   {    float4 vertex : POSITION;    float4 color : COLOR;    float2 texcoord : TEXCOORD0;    UNITY_VERTEX_INPUT_INSTANCE_ID   };    struct v2f   {    float4 vertex : SV_POSITION;    fixed4 color : COLOR;    float2 texcoord : TEXCOORD0;    float4 worldPosition : TEXCOORD1;    UNITY_VERTEX_OUTPUT_STEREO   };    v2f vert(appdata_t v)   {    v2f OUT;    UNITY_SETUP_INSTANCE_ID(v);    UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(OUT);    OUT.worldPosition = v.vertex;    OUT.vertex = UnityObjectToClipPos(OUT.worldPosition);     OUT.texcoord = v.texcoord;     OUT.color = v.color;    return OUT;   }    sampler2D _MainTex;    float _Lan;   float _StepX;    float4 frag(v2f IN) : SV_Target   {        float2 uv = IN.texcoord;    uv.x*= _Lan; uv.x = frac(uv.x);  //從這裡開始,顏色值大於指定值stepx的進行消減 int needDiscard = step(_StepX,uv.x); if(needDiscard == 1){  discard; } return float4(uv.xy,1.0,1.0);   }  ENDCG  } }}

3.加上切變,百葉窗在關(guān)閉打開時,是有透視變化的。用切變可以近似模擬透視,因為透視的實現(xiàn)代價很大,所以用切變。

添加一張圖片,并進行切變

代碼如下:

Shader "Unlit/BYCShader"{ Properties {  [PerRendererData] _MainTex ("Sprite Texture", 2D) = "white" {}  _Color ("Tint", Color) = (1,1,1,1)   _StencilComp ("Stencil Comparison", Float) = 8  _Stencil ("Stencil ID", Float) = 0  _StencilOp ("Stencil Operation", Float) = 0  _StencilWriteMask ("Stencil Write Mask", Float) = 255  _StencilReadMask ("Stencil Read Mask", Float) = 255   _ColorMask ("Color Mask", Float) = 15   _Lan("Lan",Float) = 10   _StepX("StepX",Range(0.0,1.0))=1.0   [Toggle(UNITY_UI_ALPHACLIP)] _UseUIAlphaClip ("Use Alpha Clip", Float) = 0 }  SubShader {  Tags  {   "Queue"="Transparent"   "IgnoreProjector"="True"   "RenderType"="Transparent"   "PreviewType"="Plane"   "CanUseSpriteAtlas"="True"  }   Stencil  {   Ref [_Stencil]   Comp [_StencilComp]   Pass [_StencilOp]   ReadMask [_StencilReadMask]   WriteMask [_StencilWriteMask]  }   Cull Off  Lighting Off  ZWrite Off  ZTest [unity_GUIZTestMode]  Blend SrcAlpha OneMinusSrcAlpha  ColorMask [_ColorMask]   Pass  {   Name "Default"  CGPROGRAM   #pragma vertex vert   #pragma fragment frag   #pragma target 2.0    #include "UnityCG.cginc"   #include "UnityUI.cginc"    #pragma multi_compile __ UNITY_UI_CLIP_RECT   #pragma multi_compile __ UNITY_UI_ALPHACLIP    struct appdata_t   {    float4 vertex : POSITION;    float4 color : COLOR;    float2 texcoord : TEXCOORD0;    UNITY_VERTEX_INPUT_INSTANCE_ID   };    struct v2f   {    float4 vertex : SV_POSITION;    fixed4 color : COLOR;    float2 texcoord : TEXCOORD0;    float4 worldPosition : TEXCOORD1;    UNITY_VERTEX_OUTPUT_STEREO   };    v2f vert(appdata_t v)   {    v2f OUT;    UNITY_SETUP_INSTANCE_ID(v);    UNITY_INITIALIZE_VERTEX_OUTPUT_STEREO(OUT);    OUT.worldPosition = v.vertex;    OUT.vertex = UnityObjectToClipPos(OUT.worldPosition);     OUT.texcoord = v.texcoord;     OUT.color = v.color;    return OUT;   }    sampler2D _MainTex;    float _Lan;   float _StepX;    float4 frag(v2f IN) : SV_Target   {     //這裡進行裁剪    float2 uv = IN.texcoord;    uv.x*= _Lan; uv.x = frac(uv.x); int needDiscard = step(_StepX,uv.x); if(needDiscard == 1){  discard; }  //這里進行切變 float x1 = uv.x; uv = IN.texcoord; uv+=float2(-0.5,-0.5);     uv.x-=x1;//切變時,先將重心調(diào)整到中心,然后繞每一欄的起點進行切變(這里類似于繞某一點旋轉(zhuǎn),所以后面要進行反向操作,加了就減,減了就加)    float2x2 qiebian = float2x2(1,0,(1.0-_StepX),1);    uv = mul(qiebian,uv);    uv-=float2(-0.5,-0.5);    uv.x+=x1;  float4 color= tex2D(_MainTex, uv);   return color;   }  ENDCG  } }}

到此,關(guān)于“Unityshader怎么實現(xiàn)百葉窗特效”的學習就結(jié)束了,希望能夠解決大家的疑惑。理論與實踐的搭配能更好的幫助大家學習,快去試試吧!若想繼續(xù)學習更多相關(guān)知識,請繼續(xù)關(guān)注創(chuàng)新互聯(lián)網(wǎng)站,小編會繼續(xù)努力為大家?guī)砀鄬嵱玫奈恼拢?/p>

當前文章:Unityshader怎么實現(xiàn)百葉窗特效-創(chuàng)新互聯(lián)
地址分享:http://muchs.cn/article28/dpiscp.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供手機網(wǎng)站建設(shè)、動態(tài)網(wǎng)站、網(wǎng)站維護、網(wǎng)站制作、網(wǎng)站策劃電子商務(wù)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

營銷型網(wǎng)站建設(shè)