gpt4 book ai didi

swift - 在 SceneKit 中使用 Metal 着色器

转载 作者:搜寻专家 更新时间:2023-10-31 08:33:54 33 4
gpt4 key购买 nike

我想使用 Metal 着色器将卡通/单元格着色应用于场景中使用的 Material 。我尝试实现的着色器是 Apple 自己的 AAPLCelShader,可在 MetalShaderShowcase 中找到。 .我对在 SceneKit 中实现着色器有点陌生,所以我做的每件事都可能完全错误。

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

我的方法是尝试获取 .metal 文件的路径,然后将其加载到要在 SCNMaterial shaderModifiers [String: String] 字典形式的属性,就像使用 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 文件加载的盒子几何体。文件加载工作正常,所以这不是问题。

错误来 self 尝试查找路径的第二行,它给了我“在展开可选值时发现 nil”,这在强制展开时是预期的,而不是它正在尝试的文件load 肯定在包中,相同的代码适用于其他文件类型,只是不是 .metal 的文件类型。

我是不是以完全错误的方式来处理这件事?除了我滥用 Metal 文件的问题外,我不明白为什么它不能访问该文件。

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

最佳答案

AAPLCelShader.metal 是一个完整的顶点/rastex/fragment 实现,这不是 shaderModifiers 是什么:将被注入(inject)到已经完成的着色器中的源代码。

相反,您可以创建一个 SCNProgram ,使用 AAPLCelShader.metal 中的顶点和片段函数。与 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;

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

关于swift - 在 SceneKit 中使用 Metal 着色器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30941797/

33 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com