unity shader 全屏烟雾效果

    技术2023-11-24  107

    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,小程序,软件开发,游戏制作等需求也可以联系本人,非常乐于助人。

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

     

    Processed: 0.015, SQL: 10