ShaderからPixel毎に情報を取り出す【UUJ】

現在、Unity上で描かれたイメージの深度バッファ値をピクセル毎に取り出す処理の実装を検討しているのですが、Web上のサンプルコードを見ても具体的な実装方法が理解できません。

Shaderを使ってデプス値を取得する旨の説明は見受けるのですが、Shaderで調べた値をどうやってメインプログラムに戻すのでしょうか?

あるいはこれ以外に、DepthBufferの参照についての情報がありますが、Pixel毎に情報を取り出すにはどうすればよいかなかなか理解が出来ません。


基本的にGPUで処理した結果をCPUで読み取るのはリアルタイムには向かないです。なぜなら、
1. CPUとGPUの並列性が失われる
2. GPUが書き込むメモリはCPUから読めない、もしくは読むのに時間がかかる
からです。なので、ShaderやComputeShaderを使ってGPUで完結させられないか検討してみるのもひとつの方法だと思います。
メインプログラムから深度バッファを読む関数はUnityにはない気がするのですが、
ネイティブプラグインを書けば CopyResource (DirectX) や glReadPixels (OpenGL) を使ってできるかもしれませんUnityの機能を使うのであれば、完全にオフライン処理になりますが、Shaderで読んだデプス値をRGBにエンコードしてシーンに書き込んでApplication.CaptureScreenshot(filePath) することは出来ると思います。あとは用途にもよりますが、MeshColliderにRayCastというのもありじゃないでしょうか。

この手の処理はやったことがないので、もっと良いアドバイスができる方がいらっしゃると思いますが、
調査の手掛かりにでもなれば幸いです。


UnityではGPUコード経由でなければZ値を取り出せないことが理解出来ました。昔はglReadPixel一発で自在に取り出せたのですが、リアルタイム処理優先になるとそうした機能は重視されなくなるのですね。
頂きましたアドバイスを検討すると、Shaderでデプス値をテクスチャバッファに展開して画像データアクセスさせる方法が適切であると判断しました。

Comments

comments

スポンサーリンク
336*280px
336*280px

フォローする

スポンサーリンク
336*280px