【发布时间】:2018-01-03 08:11:59
【问题描述】:
由于初始化时已知的不同输入,我正在创建一个需要不同编码着色器的类。目标是当对象被初始化时,着色器也被初始化并编译到一个库中。
我的问题是我不知道如何将 .metal 文件写入我的应用程序目录,就像我在 XCode 中看到的那样,坦率地说,我不确定 iOS 权限是否会让我这样做。我想一旦我有了金属文件,它就变得容易了,但是如何呢?
我希望在编译时编辑的着色器将根据初始化参数具有可变数量的纹理输入。
【问题讨论】:
由于初始化时已知的不同输入,我正在创建一个需要不同编码着色器的类。目标是当对象被初始化时,着色器也被初始化并编译到一个库中。
我的问题是我不知道如何将 .metal 文件写入我的应用程序目录,就像我在 XCode 中看到的那样,坦率地说,我不确定 iOS 权限是否会让我这样做。我想一旦我有了金属文件,它就变得容易了,但是如何呢?
我希望在编译时编辑的着色器将根据初始化参数具有可变数量的纹理输入。
【问题讨论】:
您不编写 .metal 文件。您可以直接从包含着色器程序文本的字符串创建MTLLibrary 对象。
您调用-newLibraryWithSource:options:error: 方法或MTLDevice 协议的-newLibraryWithSource:options:completionHandler: 方法。
也就是说,Matthijs 的答案或其他方法可能更合适。例如,根据您所针对的 iOS 版本和 GPU 系列,您可以使用带有函数常量的纹理数组来容纳可变数量的纹理。您应该展示一个您希望构建的着色器的真实示例以及它可能会如何变化。
【讨论】:
请查看“函数常量”的概念。
您可以在 .metal 文件中将值定义为 function_constant。然后,当您使用 MTLLibrary 创建函数时,您可以传入这些常量的实际值,Metal 将使用这些常量值即时编译您的着色器的专用版本。
【讨论】: