给你一个网站你怎么做,蜜桃传奇免费网页版,深圳网站建设黄浦网络 骗子,关键词全网搜索文章目录 前言一、屏幕抓取#xff0c;在上一篇文章已经写了二、实现抓取后的屏幕扭曲实现思路#xff1a;1、屏幕扭曲要借助传入 UV 贴图进行扭曲2、传入贴图后在顶点着色器的输入参数处#xff0c;传入一个 float2 uv : TEXCOORD#xff0c;用于之后对扭曲贴图进行采样3、… 文章目录 前言一、屏幕抓取在上一篇文章已经写了二、实现抓取后的屏幕扭曲实现思路1、屏幕扭曲要借助传入 UV 贴图进行扭曲2、传入贴图后在顶点着色器的输入参数处传入一个 float2 uv : TEXCOORD用于之后对扭曲贴图进行采样3、最后在片元着色器阶段使用lerp(screenUV,distortTex,_Distort);进行线性插值对扭曲程度进行控制 三、在扭曲的效果上实现流动效果实现思路 四、为了节省性能把_Distort 、_SpeedX 和 _SpeedY三个变量用一个四维变量存储 前言
Unity中Shader抓取屏幕并实现扭曲效果实现 一、屏幕抓取在上一篇文章已经写了
二、实现抓取后的屏幕扭曲
实现思路
1、屏幕扭曲要借助传入 UV 贴图进行扭曲
2、传入贴图后在顶点着色器的输入参数处传入一个 float2 uv : TEXCOORD用于之后对扭曲贴图进行采样
3、最后在片元着色器阶段使用lerp(screenUV,distortTex,_Distort);进行线性插值对扭曲程度进行控制
代码实现
Shader MyShader/P0_10_4
{Properties{//实现扭曲就需要传入贴图来实现扰度_DistortTex(DistortTex,2D) white{}_Distort(Distort,Range(0,1)) 0}SubShader{Tags{Queue Transparent}//屏幕抓取需要单独使用一个Pass —— GrabPass{} 里面什么都不写或者GrabPass{_GrabTex}GrabPass{_GrabTex}Pass{CGPROGRAM#pragma vertex vert#pragma fragment frag#include UnityCG.cgincstruct v2f{float2 uv : TEXCOORD0;};//在使用抓取的屏幕前需要像使用属性一样定义一下,_GrabTexture这个名字是Unity定义好的sampler2D _GrabTex;sampler2D _DistortTex;float4 _DistortTex_ST;fixed _Distort;//在顶点着色器的输入处不用appdata,直接使用用到的参数防止 SV_POSITION 重复定义v2f vert (float4 vertex : POSITION,//从应用程序阶段的输入多加一个uv用于对扭曲纹理的采样float2 uv : TEXCOORD,out float4 pos : SV_POSITION){v2f o;pos UnityObjectToClipPos(vertex);o.uv uv;return o;}fixed4 frag (v2f i,UNITY_VPOS_TYPE screenPos : VPOS) : SV_Target{fixed2 screenUV screenPos.xy / _ScreenParams.xy;fixed4 distortTex tex2D(_DistortTex,i.uv);//使用线性插值来控制UV的扭曲程度float2 uv lerp(screenUV,distortTex,_Distort);//对抓取的屏幕进行采样fixed4 grabTex tex2D(_GrabTex,uv);return grabTex;}ENDCG}}
}
三、在扭曲的效果上实现流动效果
实现思路 在顶点着色器处使用扭曲贴图的Tiling 及 offset 后与_Time相乘即可流动速度暴露两个float变量控制流速即可 代码实现
Shader MyShader/P0_10_4
{Properties{//实现扭曲就需要传入贴图来实现扰度_DistortTex(DistortTex,2D) white{}_Distort(Distort,Range(0,1)) 0_SpeedX(SpeedX,float) 0_SpeedY(SpeedY,float) 0}SubShader{Tags{Queue Transparent}//屏幕抓取需要单独使用一个Pass —— GrabPass{} 里面什么都不写或者GrabPass{_GrabTex}GrabPass{_GrabTex}//使用Cull off 让两面都有扭曲Cull OffPass{CGPROGRAM#pragma vertex vert#pragma fragment frag#include UnityCG.cgincstruct v2f{float2 uv : TEXCOORD0;};//在使用抓取的屏幕前需要像使用属性一样定义一下,_GrabTexture这个名字是Unity定义好的sampler2D _GrabTex;sampler2D _DistortTex;float4 _DistortTex_ST;fixed _Distort;float _SpeedX,_SpeedY;//在顶点着色器的输入处不用appdata,直接使用用到的参数防止 SV_POSITION 重复定义v2f vert (float4 vertex : POSITION,//从应用程序阶段的输入多加一个uv用于对扭曲纹理的采样float2 uv : TEXCOORD,out float4 pos : SV_POSITION){v2f o;pos UnityObjectToClipPos(vertex);o.uv TRANSFORM_TEX(uv,_DistortTex) float2(_SpeedX,_SpeedY) * _Time.y;return o;}fixed4 frag (v2f i,UNITY_VPOS_TYPE screenPos : VPOS) : SV_Target{fixed2 screenUV screenPos.xy / _ScreenParams.xy;fixed4 distortTex tex2D(_DistortTex,i.uv);//使用线性插值来控制UV的扭曲程度float2 uv lerp(screenUV,distortTex,_Distort);//对抓取的屏幕进行采样fixed4 grabTex tex2D(_GrabTex,uv);return grabTex;}ENDCG}}
}
效果
四、为了节省性能把_Distort 、_SpeedX 和 _SpeedY三个变量用一个四维变量存储
优化后
Shader MyShader/P0_10_4
{Properties{//实现扭曲就需要传入贴图来实现扰度_DistortTex(DistortTex,2D) white{}_Distort(SpeedX(X) SpeedY(y) Distort(Z),vector) (0,0,0,0)}SubShader{Tags{Queue Transparent}//屏幕抓取需要单独使用一个Pass —— GrabPass{} 里面什么都不写或者GrabPass{_GrabTex}GrabPass{_GrabTex}//使用Cull off 让两面都有扭曲Cull OffPass{CGPROGRAM#pragma vertex vert#pragma fragment frag#include UnityCG.cgincstruct v2f{float2 uv : TEXCOORD0;};//在使用抓取的屏幕前需要像使用属性一样定义一下,_GrabTexture这个名字是Unity定义好的sampler2D _GrabTex;sampler2D _DistortTex;float4 _DistortTex_ST;float4 _Distort;//在顶点着色器的输入处不用appdata,直接使用用到的参数防止 SV_POSITION 重复定义v2f vert (float4 vertex : POSITION,//从应用程序阶段的输入多加一个uv用于对扭曲纹理的采样float2 uv : TEXCOORD,out float4 pos : SV_POSITION){v2f o;pos UnityObjectToClipPos(vertex);o.uv TRANSFORM_TEX(uv,_DistortTex) _Distort.xy * _Time.y;return o;}fixed4 frag (v2f i,UNITY_VPOS_TYPE screenPos : VPOS) : SV_Target{fixed2 screenUV screenPos.xy / _ScreenParams.xy;fixed4 distortTex tex2D(_DistortTex,i.uv);//使用线性插值来控制UV的扭曲程度float2 uv lerp(screenUV,distortTex,_Distort.z);//对抓取的屏幕进行采样fixed4 grabTex tex2D(_GrabTex,uv);return grabTex;}ENDCG}}
}