Japanese memo of "Volumetric sort written by iq"

概要

  • iq さんが書いた "volumetric sort" に関する記事の日本語の簡易メモです.
  • αブレンドする際に限定的な条件の下では ランタイムの Z ソートをせずに, 事前にソートされた結果を視点方向に応じて選ぶことで解決できるという手法です.
  • アルファブレンドする際にオブジェクトを Z ソートして, 奥から手前の順に描画することがあります.
  • その際に以下の条件が満たされているとします.
    • オブジェクトの位置が固定
    • 2D または 3D グリッドにそれぞれ配置されている
  • 下図は 2D での例です.
  • 視点の向きがオレンジの場合は矢印がやや傾いているので a,b,c,d,e f,g,h,i,j, k,l,m,n,o, p,q,s,r,t という順番に描画する必要があります.
  • そして, もし視点の向きが緑の矢印の場合はこれもやや傾いているので p,k,f,a, q,l,g,b, r,m,h,c, s,n,i,d, t,o,j,e という順番に描画する必要があります.


  • 通常通りに描画するとしたら, 視点方向に応じてランタイムでオブジェクトを奥から手前に Z ソートしてから, ソートした結果で順に描画します.
  • もちろん 視点方向が変化すると, Z ソートをし直す必要があります.
  • しかし, そのランタイムの Z ソートの処理コストを省くために 視点方向に応じたパターンで事前に Z ソートしておいて, その代わりにそのパターン分のインデックスリストを持っておきます.
  • そして, ランタイムではカメラの視点向きによって, 適切な 1 通りのパターンのインデックスリストを選んで描画する いうのが今回の方法です.

2D の場合

  • まず最初にソートする方向の軸を (-x, +x, -y, +y) から選びます.
  • 次に, 残っているもう 1 つの軸のソートする方向 (-?, +?) を選びます.
  • つまり, パターンとしては下図のように 4 * 2 = 8 通りのインデックスリストがあれば OK です.


  • ランタイムでは現在のカメラがグリッドを見ている向きに応じて, 8 通りのパターンの中から 適切な 1 つのパターンを選んで描画します.

3D の場合

  • 2D の場合と同様の考え方で, 下図のように 6 * 4 * 2 = 48 通りのインデックスリストが必要になります.


まとめ

  • 「オブジェクトの位置が固定」かつ「グリッドに配置されている」という限られた条件で使える手法ですが, 視点の向きが変化した際のランタイムでのオブジェクトの Z ソートの処理をスキップすることができます.
    • 視点の位置がグリッドの中にある場合は, カリングしてしまえば大丈夫そうですね.
  • 但し, パターン分のインデックスのリストが必要となるので, それが問題になる場合(必要なメモリサイズが増える)はこの方法は向いていないです.
  • 記事によると, iq さんは 3D ノイズで作った 100 万のポイントスプライトを GPU でアルファブレンドするためにこの手法を使ったそうです.