如何在 SCNTechnique 中使用模板?

Rob*_*ert 5 stencil-buffer scenekit scntechnique

基本上,我想在一个立方体周围渲染一个轮廓。为此,我想我可以使用SCNTechnique具有以下渲染通道的 :

  1. 正常渲染立方体,并将它们占用的像素写入模板缓冲区。
  2. 如果它们在第一遍中不与模板相交,则渲染稍大的立方体。

问题是,模板中的文档SCNTechnique非常稀少,我无法确切地知道如何使用它。

我已经通过首先在禁用深度测试的情况下绘制较大的“轮廓立方体”然后再绘制普通立方体来成功绘制轮廓,这效果很好,但是由于这种方法的其他复杂性,我想改用模板。

在尝试使用模板缓冲区使其工作时,我的第一遍stencilStates看起来像(以及我认为我需要这些属性的原因):

clear = YES  // To clear the buffer from last 
enable = YES // To write to the buffer
behavior:
    writeMask = 1     // Use bit 1
    function = always // Always write to stencil regardless?
Run Code Online (Sandbox Code Playgroud)

第二遍的stencilStates样子:

clear = NO   // Keep the buffer from last step
enable = NO  // Don't write to the buffer (only read?)
behavior:
    readMask = 1      // Use bit 1
    fail     = keep   // Not sure if these...
    pass     = zero   // ...should be the other way round
Run Code Online (Sandbox Code Playgroud)

模板缓冲区行为还有很多其他属性,但我不确定我需要哪些以及如何使用它们。我也不确定模板缓冲区是否需要列为每次传递的输入或输出?

编辑 1:正是我想要实现的,通过首先绘制蓝色的较大轮廓立方体而不写入深度缓冲区来呈现:

带蓝色轮廓的立方体

如果不是因为在这个庄园里画画有一些副作用,我会留下这样的实现,但我认为模板方法会避免这些副作用,我认为知道如何使用它们会很有用反正!

编辑 2:我一直在玩,试图直接使用 OpenGL(在 C 中)产生类似的效果。我并不假装完全理解模板是如何工作的(我基本上是从教程中借用了代码),但是这些命令产生了我想要实现的目标。

在绘制主立方体之前,写入模板缓冲区:

clear = YES  // To clear the buffer from last 
enable = YES // To write to the buffer
behavior:
    writeMask = 1     // Use bit 1
    function = always // Always write to stencil regardless?
Run Code Online (Sandbox Code Playgroud)

在绘制主立方体之后,在绘制更大的轮廓立方体之前,测试当前的模板缓冲区:

clear = NO   // Keep the buffer from last step
enable = NO  // Don't write to the buffer (only read?)
behavior:
    readMask = 1      // Use bit 1
    fail     = keep   // Not sure if these...
    pass     = zero   // ...should be the other way round
Run Code Online (Sandbox Code Playgroud)

因此,问题是如何使用SCNTechnique.

小智 0

您可以使用 SCNTechnique 绘制轮廓。这个想法是将对象蒙版绘制到缓冲区,模糊蒙版的一个通道,然后将其与原始渲染帧组合。该组合着色器检查模糊通道和非模糊通道,并且仅渲染对象外部的轮廓。

这里有一个在节点周围绘制发光的示例: https: //github.com/laanlabs/SCNTechniqueGlow 您应该能够修改它以获得您想要的效果。