基本上,我想在立方体周围呈现一个轮廓。为此,我认为可以使用具有以下呈现传递的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?第二次传递的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有相当其他一些属性的模具缓冲行为,但我不确定我需要哪一个和如何使用它们。我也不确定模板缓冲区是否需要作为输入或输出列出每一次?
编辑1:,这正是我想要实现的,首先绘制蓝色、更大的大纲立方体,而不写入深度缓冲区:

如果不是因为在这个庄园里画一些副作用,我会把实现留在这里,但是我认为模板方法可以避免这些副作用,我认为知道如何使用它们是有用的!
编辑2:我一直在玩,试图直接使用OpenGL (在C中)产生类似的效果。我并不完全理解模板是如何工作的(基本上我借用了教程中的代码),但是这些命令产生了我想要实现的目标。
在绘制主多维数据集之前,写入模具缓冲区:
glStencilFunc(GL_ALWAYS, 1, 0xFF); // Set any stencil to 1
glStencilOp(GL_KEEP, GL_KEEP, GL_REPLACE);
glStencilMask(0xFF); // Write to stencil buffer
glClear(GL_STENCIL_BUFFER_BIT); // Clear stencil buffer (0 by default)绘制主多维数据集之后,在绘制较大的大纲多维数据集之前,测试当前模具缓冲区:
glStencilFunc(GL_EQUAL, 0, 0xFF); // Pass test if stencil value is 0
glStencilMask(0x00); // Don't write anything to stencil buffer因此,问题是如何使用SCNTechnique实现上述目标。
发布于 2017-08-16 16:14:06
您可以使用SCNTechnique绘制大纲。其思想是将对象掩码绘制到缓冲区中,模糊掩码的一个通道,然后将其与原始呈现的帧结合起来。该组合着色器检查模糊不清的通道,而非模糊的通道,并且只呈现物体的外部轮廓。
这里有一个例子在节点周围画了一个亮点:https://github.com/laanlabs/SCNTechniqueGlow,您应该能够修改它以获得您想要的效果。
https://stackoverflow.com/questions/41419180
复制相似问题