頭と尻尾はくれてやる!

パソコンおやじのiPhoneアプリ・サイト作成・運営日記


MTLTextureDescriptorのusageを複数指定する

Metalで画面ではなくMTLTextureに描く
↑この続き。

処理の流れの図
↑Metalでこういう処理をやろうとした。

Render functionsというのは頂点シェーダとフラグメントシェーダで、
Compute functionsというのはいわゆるコンピュートシェーダを意味してる。

Render functions1はオブジェクトを描くが出力先は画面ではなくid <MTLTexture>型のバッファ。ここではtexture1としてる。

Compute functionsはこのtexture1を読み込んで画像処理した結果を別のtexture2に出力する。

Render functions2はこのtexture2を読み込んでオブジェクトのテクスチャとして使い、画面にレンダリングする。


ここで、texture1,2のusage (MTLTextureDescriptorのプロパティ)はどうするの?というお話。

結論から言うと、
{
    textureDescriptor1.usage = MTLTextureUsageRenderTarget | MTLTextureUsageShaderRead;
}
↑最初のtexture1はレンダリングの出力先であり、かつコンピュートシェーダで読み込まれるのでその両方を指定する。
{
    textureDescriptor2.usage = MTLTextureUsageShaderWrite | MTLTextureUsageShaderRead;
}
↑もう一つのtexture2はコンピュートシェーダの出力先なので’ShaderWrite’、Render functions2で読み込まれるので’ShaderRead’を指定する。


正しく指定しないとXcodeから実機デバイスにビルド・実行すると実行時に
Texture at colorAttachment[0] has usage (0x01) which doesn't specify MTLTextureUsageRenderTarget (0x04)
↑例えばこのようなログを吐いて落ちる。

ところが、その直後にデバイスのアプリを起動すると意図通りに動く。
Xcodeは(特にアップデート後など)意味不明の警告を出したりすることがあるので、あまり気にしないでいいかと思ってしまいそうだが、今回はXcodeは間違っていなかった。

実行結果のスクショ

↑こちらが今回の処理の結果。
Render functions1で立方体を描画(テクスチャはLena)。
それをCompute functionsでぼかし処理。
Render functions2でぼかした画像をテクスチャとして再度立方体を画面に描画してる。
Lenaの画像が前記事のよりぼけている。
スポンサーサイト

<< MetalでMTLTextureを画面全体に表示する  TopPage  Metalで画面ではなくMTLTextureに描く >>

コメント


管理者にだけ表示を許可する
 

トラックバック

トラックバックURL
https://ringsbell.blog.fc2.com/tb.php/1291-803091b4




Copyright ©頭と尻尾はくれてやる!. Powered by FC2 Blog. Template by eriraha.

FC2Ad