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

时间:2017-07-27 08:43:49

标签: scenekit fragment-shader

我有简单的着色器,它允许我根据节点的局部轴(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);
}

2 个答案:

答案 0 :(得分:2)

你不想乘以u_inverseModelTransform,这会让你从世界空间回到对象空间。

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

答案 1 :(得分:1)

作为'mnuages'正确答案的必然结果,我终于想通了如果你在MetalSL而不是GLSL,你应该使用scn_frame.inverseViewTransform而不是u_inverseViewTransform

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

相关问题