Ios ARKit使用SCNTechnique在其他对象后面渲染对象轮廓
我想在我的ARKit应用程序中渲染一个gizmo对象,以便它在其他几何体后面仍然可见,但作为一个暗轮廓。我发现的Unity着色器产生了我试图在SceneKit/ARKit中再现的效果 我一直在研究如何使用SCNTechnique,并一直在使用所描述的示例。我稍微修改了示例,但总体要点是3遍着色器:Ios ARKit使用SCNTechnique在其他对象后面渲染对象轮廓,ios,swift,scenekit,arkit,metal,Ios,Swift,Scenekit,Arkit,Metal,我想在我的ARKit应用程序中渲染一个gizmo对象,以便它在其他几何体后面仍然可见,但作为一个暗轮廓。我发现的Unity着色器产生了我试图在SceneKit/ARKit中再现的效果 我一直在研究如何使用SCNTechnique,并一直在使用所描述的示例。我稍微修改了示例,但总体要点是3遍着色器: 第一遍渲染整个场景(绘制:draw\u场景) 第二遍仅渲染gizmo深度大于场景深度的部分gizmo(使用gizmo的includeCategoryMask绘制:draw\u scene) 混合第一个
draw\u场景
)includeCategoryMask
绘制:draw\u scene
)colorStates
中的设置)。然而,无论我尝试什么,在pass2中,colorStates的“clear”属性总是被忽略。我希望pass 2有一个像pass 1一样的黑色背景,但它总是从ARKit输出摄影机提要。这导致第3遍出现问题,我无法正确混合颜色,因为第2遍包含所有相机馈送细节,应该是黑色的。我不确定这是否是ARKit中的一个bug,或者我误解了SCNTechniques,但任何帮助都将不胜感激
这是我的技术:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>passes</key>
<dict>
<key>pass_scene</key>
<dict>
<key>colorStates</key>
<dict>
<key>clearColor</key>
<string>0 0 0 1</string>
<key>clear</key>
<true/>
</dict>
<key>draw</key>
<string>DRAW_SCENE</string>
<key>inputs</key>
<dict/>
<key>outputs</key>
<dict>
<key>depth</key>
<string>DEPTH</string>
<key>color</key>
<string>color_scene</string>
</dict>
</dict>
<key>pass_gizmo</key>
<dict>
<key>includeCategoryMask</key>
<integer>2</integer>
<key>colorStates</key>
<dict>
<key>clearColor</key>
<string>0 0 0 1</string>
<key>clear</key>
<true/>
</dict>
<key>depthStates</key>
<dict>
<key>func</key>
<string>greater</string>
<key>enableWrite</key>
<false/>
<key>clear</key>
<false/>
</dict>
<key>outputs</key>
<dict>
<key>depth</key>
<string>DEPTH</string>
<key>color</key>
<string>color_gizmo</string>
</dict>
<key>inputs</key>
<dict>
<key>color</key>
<string>color_gizmo</string>
</dict>
<key>draw</key>
<string>DRAW_SCENE</string>
</dict>
<key>mix</key>
<dict>
<key>colorStates</key>
<dict>
<key>clear</key>
<true/>
</dict>
<key>depthStates</key>
<dict>
<key>clear</key>
<false/>
</dict>
<key>inputs</key>
<dict>
<key>totalSampler</key>
<string>color_scene</string>
<key>gizmoSampler</key>
<string>color_gizmo</string>
</dict>
<key>outputs</key>
<dict>
<key>color</key>
<string>COLOR</string>
</dict>
<key>draw</key>
<string>DRAW_QUAD</string>
<key>program</key>
<string>doesntexist</string>
<key>metalFragmentShader</key>
<string>gizmo_fragment</string>
<key>metalVertexShader</key>
<string>gizmo_vertex</string>
</dict>
</dict>
<key>sequence</key>
<array>
<string>pass_scene</string>
<string>pass_gizmo</string>
<string>mix</string>
</array>
<key>targets</key>
<dict>
<key>color_scene</key>
<dict>
<key>type</key>
<string>color</string>
</dict>
<key>color_gizmo</key>
<dict>
<key>type</key>
<string>color</string>
</dict>
</dict>
<key>symbols</key>
<dict>
<key>vertexSymbol</key>
<dict>
<key>semantic</key>
<string>vertex</string>
</dict>
</dict>
</dict>
</plist>
我最终找到了一种创建我想要的对象轮廓着色器的方法。这并不像我希望达到的那样优雅,但这是我能在ARKit中工作的唯一解决方案 我从未设法解决我最初的问题,但我怀疑这与我的通行证上输入/输出的狡猾组合有关 如果将来有人偶然发现这一点,想要创造类似的效果,我使用下面描述的3遍SCNTE技术实现了这一点:
- 通过1,
像往常一样绘制场景。颜色输出到颜色和深度输出到深度绘制场景
- 通过2,
将我的小控件的深度绘制到深度目标:绘制场景+类别遮罩
小控件深度
- 第3步,
custom metal fragment shader比较场景深度和gizmo深度以找到隐藏的几何体,然后乘以场景颜色以创建轮廓效果DRAW_QUAD
SCNTechnique
是一个非常麻烦的工作,因为我通常非常喜欢这种格式。尽管我确信目标中正确定义了目标,但我还是很难在连续传球中彼此之间共享目标
<key>colorStates</key>
<dict>
<key>clearColor</key>
<string>0 0 0 1</string>
<key>clear</key>
<true/>
</dict>