有没有燃烧殆尽的shader

shader小白问一下:
类似这种效果
preview1
有unity源码,但是不知道怎么转成cocos的。

2赞

发出来看看

Shader “Mya/Effect/BurningPaper”

{

Properties

{

    _Color("Color" , Color) = (1,1,1,1)

    _MainTex ("Texture", 2D) = "white" {}

    _AshTex ("Ash Texture", 2D) = "white" {}

    _NoiseMap("Noise" , 2D) = "black"{}

           

    _Blend("Blend" , Range(0,1)) = 0

     [hdr]_RangeColor("Range Color" , Color) = (1,0,0,1)

    _Range("Range" , Range(0.01,0.5)) = 0.1

    _FireRange("Fire Range" , Range(0,1)) = 0.2

    _FireOffset("Fire Offset" , Range(0,1)) = 0

    [hdr]_SparkColor("Spark Color" , Color) = (1,0,0,1)

    _AshRange("Ash Range" , Range(0,1)) = 0.1

    _FlowVector("Flow Vector" , vector) = (0,0,0,0)

    _NoiseMap2("Noise2" , 2D) = "black"{}

    _VertOffset("Vert Offset" , Range(0,1))    = 0.1

    [Toggle(SMOOTHRANGE)] _Fancy ("Smooth Range?", Float) = 0

   

}

SubShader

{

    Tags { "RenderType"="Opaque" }

    LOD 100

    Blend SrcAlpha OneMinusSrcAlpha

    Cull Off

    Pass

    {

        CGPROGRAM

        #pragma vertex vert

        #pragma fragment frag

        #pragma shader_feature SMOOTHRANGE

        #include "UnityCG.cginc"

        struct appdata

        {

            float4 vertex   : POSITION;

            float2 uv       : TEXCOORD0;

        };

        struct v2f

        {

            float2 uv       : TEXCOORD0;

            float4 uv2      : TEXCOORD1;

            float4 vertex   : SV_POSITION;

        };

        fixed4      _Color;

        sampler2D   _MainTex;

        float4      _MainTex_ST;

        sampler2D   _AshTex;

       

        sampler2D   _NoiseMap;

        float4      _NoiseMap_ST ;

        sampler2D   _NoiseMap2;

        float4      _NoiseMap2_ST ;

        half        _Blend;

        half        _Range;

        fixed4      _RangeColor;

        fixed4      _SparkColor;

        half        _AshRange;

        half        _FireRange;

        half        _FireOffset;

        half4       _FlowVector;

        half        _VertOffset;

        v2f vert (appdata v)

        {

            v2f o;

            o.uv = TRANSFORM_TEX(v.uv, _MainTex);

            //通过采样两次噪音图进行叠加来让噪音更随机一些,让其中一次稍微放大一些防止完全重叠的情况

            o.uv2 = TRANSFORM_TEX(v.uv, _NoiseMap).xyxy * half4(1,1,1.3,1.3) + _FlowVector * _Time.x;

            //顶点里采样贴图需要使用tex2Dlod

            float4 noiseuv = float4(v.uv * _NoiseMap2_ST.xy + _NoiseMap2_ST.zw * _Time.x, 0,0) ;

            fixed noise = tex2Dlod(_NoiseMap2 , noiseuv) ;

            _Blend = _Blend * 4 - 1;

            //对燃烧区域的顶点做一点偏移,模拟飘动的效果

            half vertOffset =  noise *  _VertOffset * saturate (1 - (o.uv.x*4  -_Blend));

            o.vertex = UnityObjectToClipPos(v.vertex + half4(0,0,vertOffset ,0));

            return o;

        }

        half Pow2(half x)

        {

            return x*x;

        }

        half ReMap(half range, half offset , half val)

        {

        #if SMOOTHRANGE

            //Range(10-0)

            range = 10*(1 -range);

            return Pow2(max(0, 1 - Pow2(range*val + 2*val - range*offset - 1)));

        #else

            //Range(0.5-0.1)

            range = 0.1 + range * 0.4;

            return max(0 , 1 - abs(val - (offset *(1-range*2)+ range)) /range) ;

        #endif

        }

        fixed4 frag (v2f i) : SV_Target

        {

            fixed noise = (tex2D(_NoiseMap , i.uv2.xy) + tex2D(_NoiseMap2, i.uv2.zw))*0.5;

           

            //基于uv的x方向计算混合的权重,边缘使用噪音进行扰动

            //要保证四个状态(原始,燃烧,灰烬,消散)都能完整显示,需要把混合因子映射到-1~3

            _Blend = _Blend * 4 - 1;

            half blendValue = smoothstep(_Blend-_Range, _Blend+_Range, i.uv.x + noise * _Range) ;

           

            //原始的颜色

            fixed4 col = tex2D(_MainTex, i.uv.xy);

            //燃烧后的颜色

            fixed4 colAsh = tex2D(_AshTex, i.uv.xy);



            //余烬

            fixed3 spark =(smoothstep(0.8,1, noise)) * _SparkColor;

            //火焰

            //float3 burnRange = max(0 , 1 - abs(blendValue - (_FireOffset *(1-_FireRange*2)+ _FireRange)) /_FireRange) * _RangeColor;

            float3 burnRange = ReMap(_FireRange , _FireOffset, blendValue) * _RangeColor;

            //消散

            clip(col.a * (i.uv.x+ noise * _Range)  -  (_Blend  -  _Range -_AshRange)) ;

            //混合

            col.rgb = lerp(colAsh + spark, col ,  blendValue)*_Color + burnRange;

            return col;

        }

        ENDCG

    }

}

}

1赞

源代码贴出来了

TRANSFORM_TEX 这个函数在cocos上是啥?

论坛有个溶解shader,改个颜色应该能做出燃烧的效果

这个效果不复杂,可以走uv,按照uv 方向x/y,噪声溶解+高度+火焰贴图/噪声+smoothstep 透明度

transform_tex是unity里面内置的一个宏,主要作用是对某个纹理的uv进行修改。unity里的纹理属性在shader里面定义了之后,会自动给你一个XX_ST的4维向量,两个值代表xy缩放,两个代表平移。
image
cocos里面不知道有没有这个机制,但是你可以自己写一下,很简单的,就是加个缩放和平移的uv调整参数而已

燃烧:溶解
火焰:uv流+噪声图扰动

你好 请问你这边转成cocos shader了吗 我这边自己转了一份但是效果远没有你发的好 而且不知道为什么这个只有在编辑器模式下可以看到摄像机看不到 Shader_FlameCombustion.zip (1.9 KB)