shader 溶解效果

物体的淡入淡出是游戏当中很常见的一种状态切换效果,但是有时候我们希望fade切换的时候,物体能够能更有色彩层次感或者其他一些特殊的中间状态,这个时候就得自己去写着色器,这种区别于单纯的淡入和淡出的效果可以形象地叫做溶解。

demo

实现思路

溶解效果的思路很简单,先获取到当前贴图的色彩,然后定义一个对照维度,大部分情况下就取rgb的某一色彩通道就可以了,比如异名demo中的色调偏蓝色调,异名的对比值就取rgb中的blue,然后动态去改变该维度的参考值,当纹理贴图的色块blue值小于该参考值的时候就去色。当参考值变为0的时候,我们的色彩也就完全溶解掉了。effect代码如下:

void main () {
  vec4 color = vec4(1, 1, 1, 1);

  #if USE_TEXTURE
  color *= texture(texture, v_uv0);
    #if CC_USE_ALPHA_ATLAS_TEXTURE
    color.a *= texture2D(texture, v_uv0 + vec2(0, 0.5)).r;
    #endif
  #endif

  // 当颜色小于溶解的程度,则直接抛弃
  if(color.b < fade_pct) discard;
  gl_FragColor = color;
}

如果我们希望溶解更加有层次变化,我们还可以对溶解的边缘做一些处理,比如透明度改变,色彩改变等,这就需要代入我们自己的使用场景中,根据实际的需要去调整,比如异名的demo中,希望溶解的边缘有一些蓝色调的变化:

if(color.b < fade_pct + 0.1) {
  color = vec4(0.92, 0.8, 0.95, color.a);
}

然后我们需要在update的时候去动态更新并设置fade_pct,以达到纹理的溶解效果动态变化:

update(dt) {
  this.fadePct += dt * this.speed;
  this.material.setProperty('fade_pct', this.fadePct));
}

以上就是溶解效果的核心思路,完整的代码请通过源码查看。通过demo我们可以看出,不同的贴图的溶解效果和我们的溶解条件是直接关联的,左侧的死神色彩单一,蓝色通道较窄,它的变化过程就比较集中而且快,同时用蓝色调处理溶解的边缘效果的过渡也比较融洽。右边的骑士,色彩比较丰富,用单一的蓝色通道当成溶解条件和过渡就相对来说比较生硬,我们需要视项目的实际情况动态调整。

效果预览

源码获取请点击查看原文,长按二维码查看效果????

ewm

我是异名,你的阅读是我的动力

 

放大镜效果    子弹跟踪效果    移动残影效果

微信小游戏首包超出4M之后   刮刮卡实现   

遥控杆实现     金币落袋效果    背景无限滚动

使用cocos进行2D和3D混合开发   

Cocos游戏开发入门最佳实践

在Unity引擎中,Shader溶解(也称为溶剂效果或者Alpha Blending)是一种视觉技术,通过混合两个图层的Alpha通道(透明度)来创建融合、渐变或半透明的效果。它通常用于制作粒子系统、水波纹、雾气等需要平滑过渡的场景。 在Shader中,实现溶解的关键在于设置Alpha Test或是Alpha Blend功能。你可以定义一个源Alpha值(如`SrcAlpha`或`OneMinusSrcAlpha`)与目标颜色(如`DstColor`或`OneMinusDstColor`)进行混合,生成新的颜色输出。例如,在Standard Shader中,可以使用`alphaTest()`函数控制透明度,或者直接在Fragment Shader的`Output.Color`属性上应用Alpha操作。 以下是基本的实现步骤: 1. 创建或编辑Shader脚本。 2. 设置着色器输入和输出颜色变量。 3. 使用Unity提供的Alpha运算符,如`Multiply`, `Add`, 或者自定义的混合公式。 4. 利用条件控制(如`if`语句)调整透明度影响。 ```shader Shader "Custom/Solvent" { Properties { _MainTex ("Base (RGB)", 2D) = "white" {} _Color ("Color", Color) = (1,1,1,1) _BlendMode ("Blend Mode", Float) = 0.5 // 0 - No Blend, 1 - Source Alpha } SubShader { Tags {"RenderType"="Opaque"} LOD 200 Pass { CGPROGRAM #pragma vertex vert #pragma fragment frag struct appdata { float4 vertex : POSITION; float2 uv : TEXCOORD0; }; struct v2f { float2 uv : TEXCOORD0; float4 vertex : SV_POSITION; }; sampler2D _MainTex; fixed4 _Color; float4 _BlendMode; v2f vert (appdata v) { v2f o; o.vertex = UnityObjectToClipPos(v.vertex); o.uv = v.uv; return o; } fixed4 frag (v2f i) : SV_Target { fixed4 col = tex2D(_MainTex, i.uv); col.a *= _BlendMode; // 可能替换为col.rgb * _BlendMode 或者 col.rgb + (1-col.a)*_Color.rgb 等 return col; } ENDCG } } FallBack "Diffuse" } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值