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

GLSL独立发光光源开发问题:多光源出现光效拉伸

问题解决:GLSL双独立发光光源修复

你的代码里有三个关键问题导致光效拉伸:

  • 光源位置错误地混入了当前像素的uv坐标,导致每个像素计算的光源位置都在变化,光效被拉伸
  • 距离计算时符号错误,应该是当前点到光源的距离(uv - glowPos)而非相加
  • 没有截断发光值的负数部分,导致暗区干扰发光效果

修正后的代码

void mainImage( out vec4 fragColor, in vec2 fragCoord )
{
    // 归一化像素坐标,中心为原点,保持宽高比
    vec2 uv = (fragCoord - 0.5*iResolution.xy) / iResolution.y;

    vec3 col = vec3(0.);
    
    float radius = 0.5;
    float glowSpeed = 1.;
    // 固定光源位置(相对于中心)
    vec2 glowPos = vec2(0., 0.5);
    vec2 glowPos2 = vec2(0.5, 0.);
    
    // 计算发光强度:动态半径减去到光源的距离,截断负值避免暗区
    float glowCol1 = max(0., radius * (cos(glowSpeed * iTime) + 6.) / 7. - length(uv - glowPos));    
    float glowCol2 = max(0., radius * (cos(glowSpeed * iTime) + 6.) / 7. - length(uv - glowPos2));  
    
    // 叠加发光颜色(这里用黄色和青色区分两个光源,也可以保持一致)
    col += vec3(glowCol1, glowCol1, 0.);
    col += vec3(0., glowCol2, glowCol2);

    // 输出到屏幕
    fragColor = vec4(col, 1);
}

关键修改点说明

  • 固定光源位置:glowPos和glowPos2改为固定坐标,不再依赖当前像素的uv,确保每个像素都以同一个点作为光源计算
  • 距离计算修正:用uv - glowPos计算当前点到光源的欧氏距离,符合发光效果的逻辑
  • 截断负值:用max(0., ...)把发光强度的负数部分置0,避免出现比黑色更暗的区域,让发光效果更纯净
  • 可选优化:如果想要更柔和的发光衰减,可以用smoothstep替代直接相减,比如smoothstep(radius, 0., length(uv - glowPos)),能得到边缘更平滑的光效

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 05:20:43