もちゅろぐ

iOSやSwift、モバイル設計だったりRailsについてまとめていく

今やっていること

 本来なら影シェーダを組み込む予定だったけど、ちょっと脱線。まぁどちらにせよやる予定だった事。

描画順の管理

描画順は不透明⇒半透明と決まっている。先に半透明を描画して、不透明を描画すると半透明の後ろに不透明があった場合に描画されなくなってしまう。


まぁ単純に半透明を描画する場合は最後に描画すればいいだけ。でも問題はそこじゃなくて1個のオブジェクトに複数個のマテリアルが登録されていてその中に半透明と不透明が織り交じっていた場合にもちゃんと順番守って描画するようにさせることを今やってる。
今の状態だとメッシュ描画命令が来たらそのままマテリアル分ループして描画してるからブレンドOn/Offさせると画像のような問題が起きる。

大げさに書いてるけど、描画コマンドに渡すときに半透明描画と不透明描画に分ければいいんだけどね。
そのためにはまず不透明用の描画コマンドを用意しないと。


追記:これこれ、これだよ。日記用に無理やり変えてみた。


追記:同じコマンドバッファを2個用意して、1個目を通常、2個目をアルファ用と区別してモデルを描画コマンドに登録する際に
マテリアルとマテリアル数を参照できるように対応、とりあえずマテリアルのディヒューズのアルファが1より小さい場合は全部アルファ用描画コマンドに登録するようにした。
あとはアルファ用の描画コマンドを実行する箇所の間にアルファブレンドを有効したら上の画像と同じになった。


 もちろん根本的な解決じゃない。半透明のオブジェ間のソートをしていないので、同様に描画されない問題が起きる。
さてさてここが一番の問題。今の描画システムは描画コマンドに登録された順にデータを引き出して描画をしているので、完全に登録依存だ。なので今のシステムのまま描画の順番を制御することは不可能と言える。コマンドバッファ中心で描画するのではなく、新たにオブジェ中心にする必要がある。

 まぁゆっくりやるか。