【问题标题】:Using a Metal shader in SceneKit在 SceneKit 中使用金属着色器
【发布时间】:2015-09-05 15:39:33
【问题描述】:

我想使用Metal 着色器为场景中使用的材质应用卡通/单元格着色。我正在尝试实现的着色器是 Apple 自己的 AAPLCelShader,在 MetalShaderShowcase 中找到。我对在 SceneKit 中实现着色器有点陌生,所以我可能做的一切都完全错误。

据我在文档中了解,Metal 或 GL 着色器可用于修改 iOS 9 和 Xcode 7 中的 SceneKit 渲染。文档表明这与 GL 着色器的完成方式相同。

我的方法是尝试获取.metal文件的路径,然后将其加载到一个字符串中,以[String:String]字典的形式在SCNMaterialshaderModifiers属性中使用,如你会使用 GL 着色器(尽管我还没有让它正常工作)。

我的代码是:

var shaders = [String: String]()
let path = NSBundle.mainBundle().pathForResource("AAPLCelShader", ofType: "metal")!

do{
  let celShader = try String(contentsOfFile: path, encoding: NSUTF8StringEncoding)
  shaders[SCNShaderModifierEntryPointLightingModel] = celShader
}catch let error as NSError{
  error.description
}
scene.rootNode.enumerateChildNodesUsingBlock({ (node, stop) -> Void in
  node.geometry?.firstMaterial?.shaderModifiers = shaders
})

这是在一个测试场景上运行的,其中包含一个从.scn 文件加载的盒子几何体。文件加载工作正常,所以这不是问题。

错误来自我尝试查找路径的第二行,它给了我“在展开可选值时找到 nil”,这是强制展开时所预期的,除了它正在尝试的文件的事实load 肯定在捆绑包中,并且相同的代码适用于其他文件类型,但不是 .metal 的。

我是不是完全走错了路?除了我滥用金属文件的问题之外,我不明白为什么它不会访问该文件。

是否有更简单或更好的方法来实现单元格着色并最终在边缘上加粗轮廓?

【问题讨论】:

    标签: swift shader scenekit metal ios9


    【解决方案1】:

    AAPLCelShader.metal 是一个完整的 vertex/rastex/fragment 实现,而不是 shaderModifiers:将注入到已经完成的着色器中的源代码。

    相反,您可以使用 AAPLCelShader.metal 中的顶点和片段函数创建SCNProgram。与 GLSL 相比,Metal 的优点在于您可以使用names of Metal functions,而不是源代码字符串,这更易于使用,并导致在运行前编译函数,而 GLSL 不支持。 (这仍然没有达到应有的水平,Swift 会将 Metal 函数识别为正确类型、可重构、命名空间的闭包。)当然,虽然 GLSL SCNPrograms 将转换为 Metal,但对于兼容的硬件,Metal SCNPrograms 不会被翻译为过时的设备。

    关于从 SceneKit 映射到 rastex 的(错误命名的 ColorInOut)成员:

    float4 position [[position]];
    float shine;
    float3 normal_cameraspace;
    float3 eye_direction_cameraspace;
    float3 light_direction_cameraspace;
    

    …很遗憾,我还没有给你答案。

    【讨论】:

    • 这是一些很棒的信息,谢谢。它确实为这一切提供了一些启示,因为这对我来说是一个全新的领域。
    猜你喜欢
    • 1970-01-01
    • 2016-10-08
    • 2019-12-27
    • 2019-04-23
    • 1970-01-01
    • 2023-03-15
    • 1970-01-01
    • 2021-06-29
    • 2018-04-21
    相关资源
    最近更新 更多