Unityshader怎么实现百叶窗特效-创新互联

这篇文章主要介绍“Unityshader怎么实现百叶窗特效”,在日常操作中,相信很多人在Unityshader怎么实现百叶窗特效问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Unityshader怎么实现百叶窗特效”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!

创新互联客户idc服务中心,提供雅安机房托管、成都服务器、成都主机托管、成都双线服务器等业务的一站式服务。通过各地的服务中心,我们向成都用户提供优质廉价的产品以及开放、透明、稳定、高性价比的服务,资深网络工程师在机房提供7*24小时标准级技术保障。

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#代码实现)

代码如下:

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.加上切变,百叶窗在关闭打开时,是有透视变化的。用切变可以近似模拟透视,因为透视的实现代价很大,所以用切变。

添加一张图片,并进行切变

代码如下:

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;//切變時,先將重心調整到中心,然后绕每一栏的起点进行切变(这里类似于绕某一点旋转,所以后面要进行反向操作,加了就减,减了就加)    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  } }}

到此,关于“Unityshader怎么实现百叶窗特效”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注创新互联网站,小编会继续努力为大家带来更多实用的文章!

当前文章:Unityshader怎么实现百叶窗特效-创新互联
地址分享:https://www.cdcxhl.com/article28/dpiscp.html

成都网站建设公司_创新互联,为您提供手机网站建设动态网站网站维护网站制作网站策划电子商务

广告

声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 创新互联

营销型网站建设