LoginSignup
3
3

More than 3 years have passed since last update.

[Metal]metalファイルをプリコンパイルしつつ実機でもコンパイルする

Posted at

ランタイムでシェーダをコンパイルするときに、毎回実機でコンパイルエラーを確認するのは辛いですね。
なので、シェーダのプリコンパイルを挟んだ上で実機でコンパイルすることで実行前にシェーダの記述エラーに気がつくことができます。

具体的にはmetalファイルをプリコンパイルした上で、defaultLibraryを使わずにmetalファイルからソースコードを読み込んで実機でコンパイルすれば良いわけです。
しかし、XcodeはMetalファイルを検知すると問答無用でプリコンパイルしてしまう 1 ためmetalファイルをそのままアプリにバンドルするにはひと工夫必要です。

まず次のようにフォルダにファイルを配置します。

スクリーンショット 2020-03-13 2.57.45.png

この状態で、フォルダをXcodeにD&Dして「Create folder references」として登録します。

スクリーンショット 2020-03-13 2.58.38.png

次のように追加したディレクトリが青色のアイコンで登録されれば、このディレクトリ内のmetalファイルは直接バンドルされるようになります。

スクリーンショット 2020-03-13 2.59.08.png

しかしこのままではコンパイル対象にならないため、metalファイルをツリー内でD&Dしてリファレンスフォルダの外に追加します。

スクリーンショット 2020-03-13 3.00.51.png

この状態では、Example/Default.metalはプリコンパイルの対象となり、Example/Shader/Default.metalはバンドル対象になります。
また、両方のファイルの参照は同じため片方を編集したらもう片方をコピペするような作業は不要になります。

実際にバンドルされたmetalファイルを呼び出す際は


let url = Bundle.main.url(forResource: "Shader/Default", withExtension: "metal")!

と、フォルダ名を入れてurlを取得します。


  1. CompileSourcesPhaseから消してCopy Bundle Phaseに入れてもプリコンパイルします。 

3
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
3