頭と尻尾はくれてやる!

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


ARKitで顔を描くのにMetalのMTKViewだと白っぽくならなかった

以前からARKitで顔の頂点を動かす時に顔がどういうわけか白っぽくなってた。



↑こんな感じだ。
この顔の少し白くなっている部分はARSCNFaceGeometryの頂点データやフロントカメラの画像などをシェーダに渡して描かれている。

Displaying an AR Experience with Metal | Apple Developer Documentation
↑リファレンスにあるようにフロントカメラの画像はYとCbCrそれぞれに相当する2枚のidをシェーダに渡し、シェーダでYCbCr→RGBに変換している。

ところがどういうわけか周囲の画像より少し白っぽくなるのである。
自分でY,CbCrの値や変換マトリックスの値を変えたみたり、ライティング処理を適用させようとしたり、いっそ背景も同じシェーダで描画するようにしてみたりしたのだが、ことごとくうまくいかず。
ようやくたどり着いたのがMetalKitを使うこと。

Appleのサンプルコード(※1)ベースなのでARSCNView(SCNViewのサブクラス)に描画していた。
これをこれをMTKViewに描くようにした。
つまりMetalなのでpipelineやbuffers、render encoder、、、などなどやったことがある方ならわかると思うが書くべきコードの量が圧倒的に増えるのだ。
とは言ってもXcodeで新規プロジェクトを作成する時にARアプリで描画をMetalで指定すれば処理内容を勉強することができる。
これをベースにして作成したのがこちら↓



顔が白くならず周囲の画像と変わりない。区別がつかないので本当に意図するシェーダを通っているのか戸惑うほどだ。
フラグメントシェーダに渡しているものもシェーダ内での処理(RGBへの変換)も同じ。

ARSCNViewの不具合なのか仕様なのかもわからないが、とりあえずMTKViewだとなんとかなることはわかった。



※1 Appleのサンプルコード↓
Creating Face-Based AR Experiences | Apple Developer Documentation
スポンサーサイト

<< scn/daeファイルから3DオブジェクトをMetalで描画する  TopPage  iPhone 6のフロントパネルを自分で交換修理してみた >>

コメント


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

トラックバック

トラックバックURL
https://ringsbell.blog.fc2.com/tb.php/1287-a432b1a1




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

FC2Ad