Metal Shading Language

MacOS, iOS などの新しいグラフィック API といえば Metal だが、Mtal のシェーダーを記述する言語は、Metal Shading Language (MSL)という。

現在のバージョンは 3.0 で仕様も公開されている。

C++14 ベースというのは聞いていたので、クラスやメソッドなどを C/C++ や Objective-C あたりで書いておけば、シェーダー(具体的には .metal ファイル)から特別な手続きなしに呼び出せるのだろうと安直に思っていたのだが、どうやら違うようだ。

これはなかなか困った事態だ。

というのは、ある種の機能はシェーダーからも普通のコードからも使いたい、ということがよくある。

大抵は、こういった共通に使うような機能は C/C++ などで書いておけば、それほど困った事態にはならないのだが、これが必ずしも成立しないということを意味している。

StackOverFlow にもこの手のお困り質問が見られるようになった。

(追記)公式にも .metal で複雑な操作(例えば複数の .metal を使いたいような場合)をするときには、一旦、シンボルファイルを作って… という記事が上がっていた。
いや、しかし、これ本当にさせるつもりあるの???

C++ に似ているが C++ 標準ライブラリは使えない

仕様書の最初の方にも

Do not use the C++ standard library in Metal code

と早々と警告を発している。

標準ライブラリの他にもラムダ式も使えない。

 

参考:
これ
海外でもやはり。。。

(続く)

PNG連番画像からGIFパラパラアニメをつくる

PNG連番画像からGIFパラパラアニメをつくるのはたまにやるのだが、Mac だと ffmpeg を使うのが便利。
だが、引数の指定方法はけっこう忘れてしまい、その度にググったりするので、忘備録的にメモ。

まず、ffmpeg だが、作業する Mac マシンにインストールされてない場合は、例えば homebrew を使って

brew install ffmpeg

でインストール。

000.png, 001.png, 002png ・・・・ と連番が3桁の場合には、

ffmpeg -i %3d.png -vf palettegen palette.png

として、まず palette.png を生成させる。
連番が4桁のときは、%4d で指定。ここらへんの引数の渡し方は C 系っぽい(単なる感想)。

次に

ffmpeg -f image2 -r 20 -i %3d.png -i palette.png -filter_complex paletteuse robo-umamusume.gif

として、GIFパラパラアニメを作る。

また -r は FPS(Frames Per Second) を指定しているので、例えば、r = 1 とすると1秒毎に画像が切り替わるGIFアニメが得られる。上の場合は 20fps になる。

 

air-h-128k-il