2012-12-01

[][]メタボールパーティクル メタボールパーティクル - Nao_uの日記 を含むブックマーク はてなブックマーク - メタボールパーティクル - Nao_uの日記 メタボールパーティクル - Nao_uの日記 のブックマークコメント


Unityのシェーダーとマルチパスレンダリングの使い方の練習を兼ねて、メタボールパーティクルの描画を試してみた。


オフスクリーンに白黒のハイトマップをレンダリングしておいて、2パス目でハイトマップの上下との値の差分から法線マップ化して、反射と屈折した結果を合成して描画。

屈折先テクスチャも別パスで低解像度でレンダリングしていて、反射はキューブマップ+スフィアマップを使用。キューブマップだけだと光沢感が足りなかったので、スフィアマップを足した結果の輝度の高い部分だけを抽出してさらに加算する事で、強引にHDR化してる。

ポストフィルタはブルームとFXAAを使用。地面を上を流れてるときや、粒が小さくなった時の見え方が不自然になってるので、反射や屈折はもう少し工夫する必要がありそう。

  • 今回のハマりポイントのメモ
    • シェーダーで使うテクスチャの数が増えると「Program 'frag_surf', Maximum texture indirection of 4 exceeded; 5 indirections needed to compile program」というエラーが出るので「#pragma target 3.0」が必要になる。

    • カメラを追加してレンダーターゲットテクスチャを追加する事でオフスクリーンレンダリングができる。オブジェクトごとの描画パスの制御はレイヤーで行う。カメラとオブジェクト双方にどのレイヤーを描画するかのチェックを入れる必要があるので注意。ライトも同様。

    • オフスクリーンレンダリングの描画順は、カメラのDepthで制御できる。必要な場合にはカメラのHDRのチェックも忘れずに。

    • 本来は白黒のハイトマップ生成時にデプステストしないと一部描画が破綻するんだけど、描画パスやシェーダーを増やさずに済む上手いやり方が見つからなかったので保留

屈折を別パスで描画するのは背景オブジェクトが増えてくるとと負荷が高くなるので、レンダリングの途中経過やデプスバッファをテクスチャとして再利用したいところだけど、Unityでやるにはどうすれば良いんだろう?

どこかの設定でレンダリング済みのデプスバッファと背景だけを別のカメラに割り当てたりとかができるのかな。

追記:背景のテクスチャをつかって歪めたりするにはGravPassを使うらしい