unity shader 全屏烟雾效果

1:效果如上图,代码如下:

Shader "Unlit/fogshader"
{
    Properties
    {
        _MainTex ("Texture", 2D) = "white" {}
    }
    SubShader
    {
        Tags { "RenderType"="Opaque" }
        LOD 100

        Pass
        {
            CGPROGRAM
            #pragma vertex vert
            #pragma fragment frag
            // make fog work
            #pragma multi_compile_fog

            #define vec2 float2
            #define vec3 float3
            #define vec4 float4
            #define mix lerp
            #define fract frac
            #define iTime _Time.y
            #define iResolution _ScreenParams
        


            #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;

            float rand(in vec2 sd) {

                return fract(sin(dot(sd.xy, vec2(9.128, 3.256) * 293699.963)));
            }


            float n2D(in vec2 sd) {

                vec2 iComp = floor(sd);
                //integer and fractional components
                vec2 fComp = fract(sd);


                float a = rand(iComp + vec2(0.0, 0.0));    //
                float b = rand(iComp + vec2(1.0, 0.0));    // interpolation points
                float c = rand(iComp + vec2(0.0, 1.0));    // (4 corners)
                float d = rand(iComp + vec2(1.0, 1.0));    //

                vec2 fac = smoothstep(0.0, 1.0, fComp);    //interpolation factor

                //Quad corners interpolation
                return
                    mix(a, b, fac.x) +

                    (c - a) * fac.y * (1.0 - fac.x) +

                    (d - b) * fac.x * fac.y;
            }

            //fractal Brownian Motion and Motion Pattern

            #define OCTAVES 6

            float fBM(in vec2 sd) {

                //init values
                float val = 0.0;
                float freq = 1.0;
                float amp = 0.5;

                float lacunarity = 2.0;
                float gain = 0.5;

                //Octaves iterations
                for (int i = 0; i < OCTAVES; i++) {

                    val += amp * n2D(sd * freq);

                    freq *= lacunarity;
                    amp *= gain;
                }

                return val;
            }


            float mp(in vec2 p) {

                float qx = fBM(p + vec2(0.0, 0.0));
                float qy = fBM(p + vec2(6.8, 2.4));

                vec2 q = vec2(qx, qy);

                float tm = 0.008 * iTime * 1.3;    //time factor

                float rx = fBM(p + 1.1 * q + vec2(9.5, 9.3) * tm);
                float ry = fBM(p + 1.5 * q + vec2(7.2, 1.5) * -(tm + 0.002));

                vec2 r = vec2(rx, ry);

                return fBM(p + (2.0 * r));
            }


            //========================================================================

            //main()


            void mainImage(out vec4 fragColor, in vec2 fragCoord)
            {
                //Normalized pixel coordinates (from 0 to 1)
                vec2 uv = fragCoord;// / iResolution.xy;

                vec3 col = vec3(0.0,0.0,0.0);
                //col += fBM(uv*3.0);

                float wFac = mp(uv*3.0); //warping factor

                col = mix(vec3(0.101961, 0.29608, 0.26567), vec3(0.66667, 0.45667, 0.89839), clamp(pow(wFac, 2.5), 0.0, 1.0));
                col = mix(col, vec3(0.44467, 0.00567, 0.19809), clamp(pow(wFac, 0.4), 0.0, 1.0));
                col = mix(col, vec3(0.52467, 0.42567, 0.01809), clamp(wFac * wFac, 0.0, 1.0));
                col = mix(col, vec3(0.84467, 0.32567, 0.13809), clamp(smoothstep(0.0, 1.0, wFac), 0.0, 1.0));


                // Output to screen
                fragColor = vec4(col, 1.0);
            }


            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
            {
                // sample the texture
                //fixed4 col = tex2D(_MainTex, i.uv);
                vec4 col = vec4(0,0,0,0);
                mainImage(col, i.uv);
                return col;
            }
            ENDCG
        }
    }
}
 

 

本人qq:344810449,欢迎探讨研究。

有unity,shader,小程序,软件开发,游戏制作等需求也可以联系本人,非常乐于助人。

如果觉得还不错给博主来个小惊喜,纯属自愿,不强求:

 

你可能感兴趣的:(unity,algorithm,shader)