首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用ARKit在其他对象后面使用SCNTechnique呈现对象轮廓

使用ARKit在其他对象后面使用SCNTechnique呈现对象轮廓
EN

Stack Overflow用户
提问于 2020-08-31 06:00:53
回答 1查看 294关注 0票数 0

我想在我的ARKit应用程序中渲染一个gizmo对象,这样它在其他几何图形后面仍然是可见的,但是作为一个黑暗的轮廓。我发现的Unified着色器这里产生了我试图在SceneKit/ARKit中复制的效果。

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

  1. 第一遍呈现整个场景(绘图:DRAW_SCENE)
  2. 第二遍只呈现gizmo的一部分,其中gizmo的深度大于场景的深度( DRAW_SCENE:gizmo的includeCategoryMask )。
  3. 混合第一和第二通行证的输出,以便在pass 2黑暗传递1中呈现的隐藏部分。

Pass 1工作正常,因为整个场景按照预期的方式呈现为黑色背景(设置在colorStates中)。但是,无论我尝试了什么,在传递2中,colorStates的“清除”属性总是被忽略。我希望pass 2有一个像PAS-1一样的黑色背景,但是它总是输出来自ARKit的相机馈送。这导致了第3关的问题,我不能正确地混合颜色,因为pass 2包含了所有的相机馈送细节,在那里它应该是黑色的。我不确定这是ARKit中的一个bug,还是我误解了SCNTechniques,但是任何帮助都是非常感谢的。

这是我的SCNTechnique:

代码语言:javascript
复制
<?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>

主要感兴趣的区域是colorStates属性的pass_gizmo通行证从来没有实际清除/相机馈送总是呈现无论如何;

代码语言:javascript
复制
<key>colorStates</key>
<dict>
<key>clearColor</key>
    <string>0 0 0 1</string>
    <key>clear</key>
    <true/>
</dict>
EN

回答 1

Stack Overflow用户

发布于 2020-09-02 05:06:28

我最终找到了一种方法来创建我想要的对象轮廓阴影。它并不像我所期望的那样优雅,但它是我在ARKit中能够得到的唯一解决方案。

我从未设法解决我最初的问题,但我怀疑这与我的传球中的输入/输出的不可靠组合有关。

如果将来有人无意中想要创造类似的效果,我通过下面描述的3 pass SCNTechnique实现了它:

  • 通过1,DRAW_SCENE像往常一样画场景。颜色输出到颜色,深度输出到深度
  • 传递2,DRAW_SCENE + category mask将gizmo的深度绘制到一个深度目标:gizmo_depth
  • 通过3,DRAW_QUAD定制的金属碎片着色器,比较景深和景深,找出隐藏的几何图形,然后将场景的颜色相乘,形成剪影效果。

不幸的是,SCNTechnique是如此麻烦的工作,因为我通常非常喜欢的格式。虽然我确信在目标中正确地定义了目标,但在连续的传递中,彼此之间并没有共享目标,这让我感到非常痛苦。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/63665549

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档