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

如何用SceneKit+Shader Modifiers实现中心不透明边缘渐变透明球体?

解决方法

核心问题是你用了世界空间坐标计算距离,这会受球体在场景中的位置影响。应该改用模型空间坐标(即球体自身局部坐标)来计算到球心的距离,这样无论球体在场景中哪里,计算都是准确的。

另外,直接赋值alpha比乘以默认alpha更稳妥,避免默认alpha不是1导致的异常。

修正后的着色器代码:

let materialShader = """
        #pragma transparent
        #pragma fragment
        // 模型空间位置,相对于球体自身中心
        vec3 localPos = _surface.position.xyz;
        float distToCenter = length(localPos);
        // 假设球体半径为1,若你的球体半径不同,替换1.0为对应数值
        float alpha = smoothstep(1.0, 0.0, distToCenter);

        _output.color.rgb = vec3(0.0, 0.0, 1.0);
        _output.color.a = alpha;
        """

同时,必须给材质开启透明属性,可选关闭深度写入避免透明层级遮挡:

let sphereMaterial = SCNMaterial()
sphereMaterial.shaderModifiers = [.fragment: materialShader]
sphereMaterial.isTransparent = true
// 若透明部分出现显示异常,添加以下设置
sphereMaterial.writesToDepthBuffer = false

这样就能实现图中所示的中心不透明、边缘渐变透明的球体效果。


内容的提问来源于stack exchange,提问作者びんへい

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.13 02:21:12