Код: Выделить всё
xcrun metal -c dynShaders.metal -o dynShaders.air
xcrun metallib dynShaders.air -o dynShaders.metallib
< /code>
Содержимое Dynshaders.metal. < /p>
#include
using namespace metal;
#import
[[visible]]
float4 dynamicTestFunction() {
return float4(0.0,1.0,1.0,1.0);
}
< /code>
Далее я загружаю металлиб таким образом. < /p>
let libraryURL = Bundle(for: type(of: self)).url(forResource: "dynShaders", withExtension: "metallib")!
do {
self.dynLibrary = try device.makeDynamicLibrary(url: libraryURL)
print("Library successfully loaded!")
} catch {
print("Failed to load library: \(error)")
self.dynLibrary = nil
}
< /code>
С этим подходом я постоянно получаю ошибку Exc_bad без каких -либо дополнительных разъяснений. Путь существует, файл есть, но ошибка возникает без предоставленной информации. . < /p>
xcrun metal -dynamiclib dynShaders.metal -o dynShaders.metallib
< /code>
Такая библиотека успешно загружается и не производит никаких ошибок. < /p>
Далее я составляю шейдер из текста, где я пытаюсь использовать функция из динамической библиотеки таким образом. < /p>
let compileOptions = MTLCompileOptions()
if let dynLibrary {
compileOptions.libraries = [dynLibrary]
}
let library = try device.makeLibrary(source: source, options: compileOptions)
return library.makeFunction(name: "dynamicShader")
< /code>
Вот как выглядит последний шейдер, тот, который я пытаюсь скомпилировать. < /p>
#include
using namespace metal;
#import
extern float4 dynamicTestFunction();
fragment float4 dynamicShader(VertexIn vertexIn [[stage_in]]) {
float4 color = float4(1.0,1.0,1.0,1.0);
color = dynamicTestFunction();
return color;
}
< /code>
И я всегда получаю ошибку. < /p>
Shader compilation error: Error Domain=MTLLibraryErrorDomain Code=3 "Undefined symbol(s) for architecture 'air64':
'_Z23dynamicApplyMainTexturev', referenced from:
dynamicShader in program_object_0
error: symbol(s) not found for target 'air64-apple-ios18.0.0'
" UserInfo={NSLocalizedDescription=Undefined symbol(s) for architecture 'air64':
'_Z23dynamicApplyMainTexturev', referenced from:
dynamicShader in program_object_0
error: symbol(s) not found for target 'air64-apple-ios18.0.0'
< /code>
Я попытался компилировать с указанной архитектурой, но это не помогло, как это. < /p>
xcrun metal -dynamiclib dynShaders.metal -arch air64 -o dynShaders.metallib
< /code>
Я также попытался добавить архитектуру при создании .air. < /p>
xcrun metal dynShaders.metal -arch air64 -c -o dynShaders.air
Подробнее здесь: https://stackoverflow.com/questions/793 ... ic-library