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