shader小白问一下:
类似这种效果

有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缩放,两个代表平移。

cocos里面不知道有没有这个机制,但是你可以自己写一下,很简单的,就是加个缩放和平移的uv调整参数而已
燃烧:溶解
火焰:uv流+噪声图扰动
你好 请问你这边转成cocos shader了吗 我这边自己转了一份但是效果远没有你发的好 而且不知道为什么这个只有在编辑器模式下可以看到摄像机看不到 Shader_FlameCombustion.zip (1.9 KB)