如何为SK3DNode设置SCNTechnique以实现3D模型边框效果
我完全懂你现在的困扰——之前用SCNView的时候,直接给视图挂个SCNTechnique就能轻松给3D模型加上边框,可换成SK3DNode之后,连个能直接设置technique的SCNView都没有,试了给相机设camera.technique还触发了Metal的断言错误,确实挺闹心的。
先拆解下你碰到的那个错误:
-[MTLDebugRenderCommandEncoder setRenderPipelineState:]:1616: failed assertion `Set Render Pipeline State Validation
For depth attachment, the render pipeline's pixelFormat (MTLPixelFormatInvalid) does not match the framebuffer's pixelFormat (MTLPixelFormatDepth32Float_Stencil8).
这个错误的核心是渲染管线的深度附件格式和SK3DNode的帧缓冲格式不匹配。SCNView和SK3DNode的默认渲染环境不一样,原来的technique配置里没考虑到SK3DNode用的是MTLPixelFormatDepth32Float_Stencil8这个深度格式,导致Metal校验失败。
针对你的情况,给你两个具体的解决方向:
1. 调整SCNTechnique的配置,适配SK3DNode的深度格式
你需要修改创建SCNTechnique的配置(不管是JSON文件还是代码里的字典),给每个渲染Pass添加深度附件的格式声明,确保和SK3DNode的帧缓冲一致。
举个例子,假设你的technique配置里有一个渲染Pass,要在Pass的配置里加上:
"depthAttachment": { "pixelFormat": "depth32Float_stencil8" }
这样就能让渲染管线的深度格式和SK3DNode的帧缓冲对齐,避免断言错误。
2. 正确绑定technique到SK3DNode的相机
确认SK3DNode使用的相机(也就是它的pointOfView属性)是你设置了technique的那个相机。如果你的SK3DNode默认用的是场景里的相机,记得先把这个相机的technique属性设为你调整好的那个。
结合你提供的示例项目来看:
- 顶部的SCNView能正常显示黄色边框,是因为它的默认深度格式和technique的配置兼容;
- 底部的SK3DNode没效果还崩溃,就是因为深度格式不匹配,加上technique没适配它的渲染环境。
你可以先把technique的配置改好,再重新给相机设置technique,应该就能解决崩溃问题,同时让边框效果在SK3DNode里正常显示了。如果还是有问题,记得检查technique里每个Pass的输入输出是否正确,比如有没有正确传递深度缓冲——SK3DNode的渲染流程和SCNView略有不同,可能需要微调Pass之间的依赖关系。
备注:内容来源于stack exchange,提问作者OMGPOP

