Rob*_*ert 5 stencil-buffer scenekit scntechnique
基本上,我想在一个立方体周围渲染一个轮廓。为此,我想我可以使用SCNTechnique具有以下渲染通道的 :
问题是,模板中的文档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 您应该能够修改它以获得您想要的效果。
| 归档时间: |
|
| 查看次数: |
1251 次 |
| 最近记录: |