SceneKit,基于世界坐标将颜色叠加到基于节点的着色器

SceneKit, shader to overlay color based on world coordinates to node based

我有一个简单的着色器,它允许我根据节点的局部轴 (x > 0) -> 绿色重绘节点颜色,但是如何让它根据世界坐标工作。

(可能基于着色器,而不是通过从场景中转换一些点并将其传递给着色器)

Shader demo

vec4 pos = u_inverseModelTransform * u_inverseViewTransform * vec4(_surface.position, 1.0);

if (pos.x > 0.0) {
    _output.color.rgb = vec3(0.0, 0.8, 0.0);
}

您不想乘以 u_inverseModelTransform,这会使您从世界 space 回到对象 space。

vec4 pos = u_inverseViewTransform * vec4(_surface.position, 1.0);

作为“mnuages”正确答案的必然结果,我终于发现如果你使用的是 MetalSL 而不是 GLSL,你应该使用 scn_frame.inverseViewTransform 而不是 u_inverseViewTransform

这很棘手,因为 SceneKit 会自动尝试将 GLSL shaderModifiers 交叉编译到 MetalSL 中,因此有时很难知道您使用的是哪一个。 (例如,您可以让您的 SceneKit 视图支持 Metal 而不是 OpenGL 或 GLES 支持,并且仍然在 GLSL 中编写您的着色器修改器,SceneKit 将工作。)