3
votes

I have used shader modifiers for Plane but its not working. Can anyone suggest me how to solve it?

let myShaderfragment = "#pragma transparent;\n" + "_output.color.a = 0.0;"
let myShaderSurface = "#pragma transparent;\n" + "_surface.diffuse.a = 0.0;"
 material.shaderModifiers = [SCNShaderModifierEntryPoint.fragment : myShaderfragment, SCNShaderModifierEntryPoint.surface : myShaderSurface]
2

2 Answers

11
votes

The SceneKit: What's New session from WWDC 2017 explains how to do that.

  1. For the plane, use a material with constant as its lightingModel. It's the cheapest one.
  2. This material will have writesToDepthBuffer set to true and colorBufferWriteMask set to [] (empty option set). That way the plane will write in the depth buffer, but won't draw anything on screen.
  3. Set the light's shadowMode to deferred so that shadows are not applied when rendering the objects themselves, but as a final post-process.
1
votes

There's a dedicated lighting model now (SCNLightingModelShadowOnly) to only render shadows