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
相关产品推荐
相关产品推荐

