You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

WebGL白色粒子淡出失效问题求助

问题分析与解决方案

原因

你的代码通过叠加黑色半透明图层实现粒子淡出效果,但画布的CSS背景色是深灰色(#111,对应RGB值约(0.067, 0.067, 0.067))。白色粒子衰减时,颜色会逐渐趋近于黑色,而非画布的深灰色背景,导致视觉上留下与背景不一致的残留痕迹;其他颜色粒子因色调差异或原有颜色逻辑,衰减后与背景的视觉冲突不明显,所以表现正常。

另外,顶点着色器中的c2rgb函数未被实际调用,当前所有粒子都被固定渲染为白色(vec4(1,1,1,a_data.w)),这进一步放大了白色粒子的痕迹问题。

解决方案

1. 匹配淡出图层与画布背景色

修改顶点着色器的clear函数,将黑色替换为画布背景的深灰色,让淡出效果最终趋近于背景色:

void clear(){
    gl_Position = vec4( a_data.xy, 0, 1 );
    // 使用#111对应的归一化RGB值(17/255≈0.0667)
    v_color = vec4( 0.0667, 0.0667, 0.0667, a_data.w );
}

2. 修复粒子颜色逻辑(可选)

如果需要使用自定义颜色而非固定白色,修改draw函数,启用c2rgb解析传入的颜色值:

void draw(){
    gl_Position = vec4( vec2( 1, -1 ) * ( ( a_data.xy / u_res ) * 2. - 1. ), 0, 1 );
    // 解析a_data.z中的整数颜色值,替换固定白色
    v_color = vec4( c2rgb(int(a_data.z)), a_data.w );
}

这样粒子颜色会根据a_data.z传入的颜色值动态变化,同时淡出时会平滑过渡到背景色,不会留下痕迹。

3. 验证混合模式(可选)

当前使用的gl.SRC_ALPHA, gl.ONE_MINUS_SRC_ALPHA是标准的alpha混合模式,无需修改。如果需要更强烈的淡出效果,可以微调webgl.clear()中的alpha值(当前为0.1),但核心问题还是颜色匹配。

修改后的关键代码片段

调整后的顶点着色器:

#version 300 es
uniform int u_mode;
uniform vec2 u_res;
in vec4 a_data;
out vec4 v_color;

vec3 c2rgb(int color_int){
    int r = color_int >> 16;
    int g = color_int >> 8 & 0xff;
    int b = color_int & 0xff;
    return vec3(r/255.0, g/255.0, b/255.0);
}

void clear(){
    gl_Position = vec4( a_data.xy, 0, 1 );
    // 匹配画布背景#111的归一化RGB值
    v_color = vec4( 0.0667, 0.0667, 0.0667, a_data.w );
}
void draw(){
    gl_Position = vec4( vec2( 1, -1 ) * ( ( a_data.xy / u_res ) * 2. - 1. ), 0, 1 );
    // 启用自定义颜色解析(可选)
    v_color = vec4( c2rgb(int(a_data.z)), a_data.w );
}
void main(){
    if( u_mode == 0 )
        draw();
    else
        clear();
}

内容的提问来源于stack exchange,提问作者dragoon

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.05 23:40:19