頭と尻尾はくれてやる!

iOSアプリなどの開発日記です


MTLTextureに値を出力してコンピュートシェーダで利用したい

Metalでオブジェクトを画面ではなくテクスチャ(id<MTLTexture>型)に描く、という手法がある。色だけでなく描画に必要なデータ(深度など)を記録することもできる。

Deferred Lighting | Apple Developer Documentation
↑こちらが参考になる。

このような手法でテクスチャに描いたものをコンピュートシェーダで画像処理しようとした。


↑実行結果の例はこちらなのだが、
1) 背景と顔部分のメッシュ(目を変形済み)をカラー画像用のテクスチャに出力
2) なめらかにしたい肌の頂点には1.0という値を与えてその結果をテクスチャに出力
3) 唇部分の頂点には1.0という値を与えてその結果をテクスチャに出力
4) コンピュートシェーダで全てのテクスチャから画像を作成する
という流れになっている。

XcodeのGPU Frame Capture and Metal API Validation Toolsで出力内容を確認(上の動画とは別なものだけど)すると、、、

MTLTextureの内容

↑このようになっている。
左の画像がフロントカメラ画像と顔メッシュをrgbで描いたもので、
真ん中が肌をなめらかにしたい部分、
右が唇部分を示す。
(口のところの緑は不明)
コンピュートシェーダでは右二つのテクスチャを利用して肌を滑らかにしたり唇を赤くする位置を把握し、それらの処理を行う。

出力結果

↑参考までにその結果はこのようになる。


この2)および3)のデータ用テクスチャは
MTLTextureDescriptor *textureDescriptor = [MTLTextureDescriptor texture2DDescriptorWithPixelFormat:MTLPixelFormatR32Float width:ViewWidth height:ViewHeight mipmapped:NO];
↑このようにMTLPixelFormatR32Floatを使っている。
先ほどのデバッグツールには32ビットもいらんやろ!と言われるのだがそれは置いといて、、、

問題はこの画像をコンピュートシェーダで参照する時だ。
kernel void compositionKernelFunction(
                                      texture2d<half, access::read>  rgbTexture   [[ texture(kIndexRGB) ]],
                                      texture2d<half, access::read>  lipInfoTexture   [[ texture(kIndexLipInfo) ]],
…
{
    …
    half4 lipRate = lipInfoTexture.read(uint2(centerX,centerY));
    if (lipRate.r > 0.999) {
        …
}
↑このような感じでコンピュートシェーダでテクスチャ画像を参照しようとするとhalf4のrで値を得ることはできる(halfではなくfloatでも動いた)。

でもなんか気持ち悪い。
そもそもMTLTextureDescriptorで画像のフォーマットにMTLPixelFormatR32Floatと指定しているのになんでrgbaなんだよ?

それじゃあ、と、、、
depth2d<float, access::read>  lipInfoTexture   [[ texture(kCTIndexColoring) ]]
↑depth2dで受け取ると
float lipRate = lipInfoTexture.read(uint2(centerX,centerY));
↑このようにfloatで値を得ることができる。
でも、depth2dってそもそも深度記述用のじゃないの?
しかもリファレンスによるとdepth2dの場合はfloatでないとダメと書いてるので、16bitのhalfとかだと使えないしなあ。


どちらにせよなんだか気持ち悪い(え?画像が一番気持ち悪い?)。
結局どう記述するのがよいのか今の所はっきりせず。
スポンサーサイト




<< Metalでテクスチャを持つdaeファイルを描画する  TopPage  iOSでUIViewをpdfファイルにする >>

コメント


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

トラックバック

トラックバックURL
https://ringsbell.blog.fc2.com/tb.php/1295-6ec5f473




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