生成MTLLibrary


生成Metal庫有很多方法

  • 從Metal源碼生成庫: 將源碼放進一個string中,然后使用newLibraryWithSource來構建MTLLibrary
  • 將.metal編譯為.metallib,生成.metallib可以是Xcode自動生成,然后用newDefaultLibrary取出;或者手動用編譯工具生成(newLibraryWithFile);還有奇技淫巧,將生成的.metal轉成.h頭文件,之后用newLibraryWithData來取用。

參考:
Metal file as part of an iOS framework
Metal default library not found
將.metal轉成.h的示例
該答主很6

手動編譯Metal源碼並生成Metal庫

這個方法是比較推薦的
具體步驟:

  1. 使用metal工具將每一個.metal文件編譯為.air文件
    xcrun -sdk macosx metal -c mylibrary.metal -o mylibrary.air
  2. 使用metallib工具將.air或者.metalar文件生成一個.metallib文件
    xcrun -sdk macosx metallib mylibrary.air -o mylibrary.metallib

參考:
Functions and Libraries
Creating Libraries During the App Build Process

將多個.metal編譯生成一個.metallib

按照官方步驟:

  1. 使用metal工具將每一個.metal文件編譯為.air文件
    xcrun -sdk macosx metal -c mylibrary.metal -o mylibrary.air
  2. 使用metal-ar工具將多個.air文件歸檔為一個.metalar文件(具體操作類似於UNIX ar工具)
    xcrun -sdk macosx metal-ar r mylibrary.metalar mylibrary1.air mylibrary2.air mylibrary3.air
  3. 使用metallib工具將.air或者.metalar文件生成一個.metallib文件
    xcrun -sdk macosx metallib mylibrary.air -o mylibrary.metallib
    或者
    xcrun -sdk macosx metallib mylibrary.metalar -o mylibrary.metallib

小規模測試(將三個.metal生成一個.metallib)成功,但是網上說會存在問題,實際測試中沒有發現問題,具體原因目前不明。

參考:
ar command in Linux with examples
Compiling multiple Core Image metal shaders into 1 Metal Library
Compiling multiple .metal files into one .metallib

將.metallib放在bundle文件夾中使用

NSError *libraryError = NULL;
NSString *libraryFile = [[NSBundle mainBundle] pathForResource:@"MyLibrary" ofType:@"metallib"];
id <MTLLibrary> myLibrary = [_device newLibraryWithFile:libraryFile error:&libraryError];
if (!myLibrary) {
    NSLog(@"Library error: %@", libraryError);
}

iOS 獲取從制定bundle文件中讀取圖片的圖片


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM