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

Fragment Shader实现黑洞效果求助:棋盘格吸纳入帧中心

黑洞效果实现技术提示

你当前通过位移纹理偏移UV的方式,无法精准模拟黑洞那种向中心聚集的引力扭曲,得到的是无规则的偏移效果。正确的实现应该基于像素到屏幕中心的距离来计算定向偏移,以下是具体步骤:

  • 第一步:转换UV到中心坐标系
    先把原UV坐标转换为以屏幕中心为原点的坐标系,范围从(-1,-1)到(1,1),方便计算像素到中心的距离:

    vec2 uv = vTextureCoord * 2.0 - 1.0; // 将[0,1]范围的UV转为[-1,1]
    float distanceToCenter = length(uv); // 计算当前像素到中心的直线距离
    
  • 第二步:计算引力扭曲偏移量
    黑洞的扭曲逻辑是:越靠近中心,偏移强度越大,且偏移方向指向中心。可以用类似引力衰减的公式(如1/d²)控制强度,同时加入小常数避免除以0:

    float blackholeStrength = 0.4; // 控制黑洞吸力强度,可根据效果调整
    vec2 direction = normalize(-uv); // 偏移方向:指向屏幕中心
    float distortion = blackholeStrength / (distanceToCenter * distanceToCenter + 0.05);
    vec2 distortedUv = uv + direction * distortion;
    

    若需要更自然的边缘过渡,可给distortion套上smoothstep函数限制范围。

  • 第三步:转换回原UV范围并采样纹理
    把扭曲后的坐标转换回[0,1]的标准UV范围,再采样原纹理:

    distortedUv = (distortedUv + 1.0) / 2.0; // 从[-1,1]转回[0,1]
    distortedUv = clamp(distortedUv, 0.0, 1.0); // 限制UV在纹理范围内,避免采样错误
    vec4 finalColor = texture2D(sourceImage, distortedUv);
    gl_FragColor = finalColor;
    
  • 额外优化:模拟黑洞暗化效果
    若要更贴近真实黑洞视觉,可给中心区域添加暗化处理:

    float centerDarkness = smoothstep(0.3, 0.0, distanceToCenter); // 中心区域平滑暗化
    finalColor.rgb *= 1.0 - centerDarkness * 0.7;
    

    如果你的场景原本有vDisplacedTextureCoord这类基础位移,只需把黑洞扭曲叠加到该坐标上即可。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.03 18:15:55