Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/108.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios ARKit使用SCNTechnique在其他对象后面渲染对象轮廓_Ios_Swift_Scenekit_Arkit_Metal - Fatal编程技术网

Ios ARKit使用SCNTechnique在其他对象后面渲染对象轮廓

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) 混合第一个

我想在我的ARKit应用程序中渲染一个gizmo对象,以便它在其他几何体后面仍然可见,但作为一个暗轮廓。我发现的Unity着色器产生了我试图在SceneKit/ARKit中再现的效果

我一直在研究如何使用SCNTechnique,并一直在使用所描述的示例。我稍微修改了示例,但总体要点是3遍着色器:

  • 第一遍渲染整个场景(绘制:
    draw\u场景
  • 第二遍仅渲染gizmo深度大于场景深度的部分gizmo(使用gizmo的
    includeCategoryMask
    绘制:
    draw\u scene
  • 混合第一个和第二个过程的输出,以便在过程2中渲染的隐藏部分使过程1变暗
  • 过程1工作正常,因为整个场景按预期渲染为黑色背景(如
    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步,
      DRAW_QUAD
      custom metal fragment shader比较场景深度和gizmo深度以找到隐藏的几何体,然后乘以场景颜色以创建轮廓效果
    不幸的是,
    SCNTechnique
    是一个非常麻烦的工作,因为我通常非常喜欢这种格式。尽管我确信目标中正确定义了目标,但我还是很难在连续传球中彼此之间共享目标

    <key>colorStates</key>
    <dict>
    <key>clearColor</key>
        <string>0 0 0 1</string>
        <key>clear</key>
        <true/>
    </dict>