如何为 SceneKit 预编译 PBR 着色器?
Posted
技术标签:
【中文标题】如何为 SceneKit 预编译 PBR 着色器?【英文标题】:How to precompile PBR shaders for SceneKit? 【发布时间】:2018-03-03 14:01:34 【问题描述】:我注意到,如果您有一个空场景,然后使用基于物理的照明在其中加载 3D 模型,则当对象出现时会出现一点点卡顿。如果我在那之后添加一个不同的对象,就不会发生这种口吃。
查看分析器,默认 PBR 着色器似乎在第一个慢帧期间进行编译。是否可以预编译这些着色器,以便在我第一次渲染模型时不会发生这种情况?
Similar issues 已经在其他框架中提出,例如 Three.js。预防似乎是一件明智的事情。
【问题讨论】:
我不知道 SceneKit,但是有没有在屏幕外渲染的选项?您可以在“加载”期间和开始游戏之前或其他任何事情之前将这样的模型渲染到屏幕外吗? @KenThomases 这就是我一直在做的,但它很老套,我想知道是否有更好的方法。 由于着色器通常依赖于平台(即在手头的硬件卡上编译),为一个特定平台预编译它会在其他硬件上产生问题,就像@KenThomases 所说,屏幕外渲染是最好的选择。 运气好吗?我刚刚添加了一个delay
函数,等待 1 秒再显示,我讨厌。
【参考方案1】:
如果您想预编译基于物理的渲染 (PBR) 或任何其他常规 SceneKit 的着色器,您必须使用 SCNProgram
类,它是一个完整的 Metal 着色器程序,可替代 SceneKit 对几何体或材质的渲染。
这是一个page,其中包含代码 sn-ps 和有用的链接,向您展示了如何使用顶点或片段预编译的金属着色器。
【讨论】:
以上是关于如何为 SceneKit 预编译 PBR 着色器?的主要内容,如果未能解决你的问题,请参考以下文章
iOS 14 解决方法中的 SceneKit Metal 着色器编译性能错误