如何用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,提问作者びんへい
相关产品推荐
相关产品推荐

