Unity 热扭曲Shader

Unity 热浪扭曲Shader的实现,参考http://blog.csdn.net/qq18052887/article/details/50457680这位博主大大的实现方式。
首先介绍网上常见的使用GrabPass的实现方式来实现,主要思路是通过将GrabPass截取的图片根据噪声图片来偏移截图的uv,从而实现图片的扭曲。
下面贴出代码:

Shader "Hidden/ImageGlass"
{
    Properties
    {
        _MainTex ("Texture", 2D) = "white" {}
        _NoiseTex("Noise Texture",2D) = "white"{}
        _MaskTex("Mask Texture",2D) = "white"{}
        _HeatTime ("Heat Time",range(0,1.5)) = 1
        _HeatForce ("Heat Force",range(0,1.0)) = 0.1
    }
    SubShader
    {
        Tags {"Queue" = "Transparent"}

        Blend SrcAlpha OneMinusSrcAlpha
        AlphaTest Greater 0.1
        Cull Off
        ZWrite Off
        Lighting Off

       GrabPass{"_RefractionTex"}    

        Pass
        {
            CGPROGRAM
            #pragma vertex vert
            #pragma fragment frag

            #include "UnityCG.cginc"

            sampler2D _MainTex;
            float4 _MainTex_ST;
            sampler2D _NoiseTex;
            float4 _NoiseTex_ST;
            float  _HeatTime;
            float  _HeatForce;
            sampler2D _RefractionTex;
            sampler2D _MaskTex;


            struct appdata
            {
                float4 vertex : POSITION;
                float2 uv : TEXCOORD0;
            };

            struct v2f
            {
                float2 uv : TEXCOORD0;
                float4 uvgrab : TEXCOORD1;
                float4 vertex : SV_POSITION;
            };

            v2f vert (appdata v)
            {
                v2f o;
                o.vertex = mul(UNITY_MATRIX_MVP, v.vertex);
                o.uv = TRANSFORM_TEX(v.uv,_MainTex);
                o.uvgrab = ComputeGrabScreenPos(o.vertex);
                return o;
            }


            fixed4 frag (v2f i) : SV_Target
            {

                /*===============================================================
                                    将uv坐标偏移
                ================================================================*/
                half4 offestcol1 = tex2D(_NoiseTex,i.uv + _Time.xz * _HeatTime);
                half4 offestcol2 = tex2D(_NoiseTex,i.uv - _Time.yx * _HeatTime);
                i.uvgrab.x += ((offestcol1.r + offestcol2.r) - 1) * _HeatForce;
                i.uvgrab.y += ((offestcol1.g + offestcol2.g) - 1) * _HeatForce;

                /*===========================================================*/
                half4 col = tex2Dproj(_RefractionTex,UNITY_PROJ_COORD(i.uvgrab));

                half4 maskcol = tex2D(_MaskTex, i.uv);

                col.a = maskcol.a;

                half4 tint = tex2D(_MainTex,i.uv);

                return col * tint;
            }
            ENDCG
        }
    }
}

第二种方法

因为GrabPass在移动平台上消耗很大,所以参考博主的文章,其实是可以在渲染后直接对相机图片进行扭曲的,效率就上来了。

Shader "Hidden/ImageGlass"
{
     Properties   
    {  
        _MainTex ("Base (RGB)", 2D) = "white" {}  
        _NoiseTex ("Noise Texture (RG)", 2D) = "white" {}  
        _MaskTex ("Mask Texture", 2D) = "white" {}  
        _HeatTime  ("Heat Time", range (0,1.5)) = 1  
        _HeatForce  ("Heat Force", range (0,0.1)) = 0.1  
    }  

    SubShader   
    {  
        Pass  
        {  
            CGPROGRAM  
            #pragma vertex vert_img  
            #pragma fragment frag  
            #pragma fragmentoption ARB_precision_hint_fastest  
            #include "UnityCG.cginc"  

            float _HeatForce;  
            float _HeatTime;  

            uniform sampler2D _MainTex;  
            uniform sampler2D _NoiseTex;  
            uniform sampler2D _MaskTex;  

            fixed4 frag(v2f_img i) : COLOR  
            {  
                fixed mask = tex2D(_MaskTex, i.uv).a;  

                // 扭曲效果  
                half4 offsetColor1 = tex2D(_NoiseTex, i.uv + _Time.xz*_HeatTime);  
                half4 offsetColor2 = tex2D(_NoiseTex, i.uv - _Time.yx*_HeatTime);  
                i.uv.x += ((offsetColor1.r + offsetColor2.r) - 1) * _HeatForce * mask;  
                i.uv.y += ((offsetColor1.g + offsetColor2.g) - 1) * _HeatForce * mask;  

                fixed4 renderTex = tex2D(_MainTex, i.uv);  

                return renderTex;  
            }  

            ENDCG  
        }  
    }   
    FallBack off  
}

这个还要配合屏幕后处理脚本使用。

要实现图像扭曲过场效果,可以使用Unity3D中的Shader。具体实现步骤如下: 1. 创建一个新的Shader,并将其属性设置为Unlit/Texture。 2. 在Shader中添加一个名为“Distortion”的属性,类型为2D纹理,用于存储扭曲图像。 3. 在Shader中添加一个名为“DistortionStrength”的属性,类型为Range,用于控制扭曲强度。 4. 在Shader的片段着色器中,使用tex2D函数获取原始纹理的颜色,并使用uv坐标对扭曲图像进行采样。 5. 将扭曲图像的采样值与“DistortionStrength”属性相乘,并将结果添加到原始颜色中。 6. 最后,将新的颜色值输出到屏幕。 下面是一个简单的Shader示例: ``` Shader "Custom/DistortionTransition" { Properties { _MainTex ("Texture", 2D) = "white" {} _Distortion ("Distortion", 2D) = "white" {} _DistortionStrength ("Distortion Strength", Range(0.0, 1.0)) = 0.5 } SubShader { Pass { CGPROGRAM #pragma vertex vert #pragma fragment frag #include "UnityCG.cginc" struct appdata { float4 vertex : POSITION; float2 uv : TEXCOORD0; }; struct v2f { float2 uv : TEXCOORD0; float4 vertex : SV_POSITION; }; sampler2D _MainTex; sampler2D _Distortion; float _DistortionStrength; v2f vert (appdata v) { v2f o; o.vertex = UnityObjectToClipPos(v.vertex); o.uv = v.uv; return o; } fixed4 frag (v2f i) : SV_Target { // Get the original color fixed4 texColor = tex2D(_MainTex, i.uv); // Get the distortion value float4 distortion = tex2D(_Distortion, i.uv); // Calculate the distortion offset float2 offset = (distortion.rg * 2.0 - 1.0) * _DistortionStrength; // Apply the distortion to the UV coordinates float2 distortedUV = i.uv + offset; // Get the color from the distorted UV coordinates fixed4 distortedColor = tex2D(_MainTex, distortedUV); // Add the distortion to the original color return texColor + (distortedColor - texColor); } ENDCG } } FallBack "Diffuse" } ``` 在使用这个Shader时,可以将原始纹理作为“_MainTex”属性的值,将扭曲图像作为“_Distortion”属性的值,然后通过修改“_DistortionStrength”属性的值来控制扭曲强度。 希望这个示例能够帮助你实现所需的效果。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值