1

GPU メモリを超える大規模なデータ セットの GPU ベースのレイ キャスティング ボリューム レンダリングを実装したいと考えています。私はこのようにしようとします:

(1)まず、ボリュームを同じ大きさのレンガに分割します。

(2)次に、伝達関数に従って、各ブリックが透明かどうかを決定します。

(3)次に、不透明なブリックを「Packed-Texture」に保存します。レイキャスティング レンダリング中にサンプリングするために、「Index-Texture」と呼ばれる別のテクスチャを作成します。これは、ブリック インデックスを Packed-Texture に保存します。

シェーダーでレンダリング中にサンプリングを行う場合、まずサンプル ポイントがどのブリック内にあるかを計算します。次に、Index-Texture にアクセスしてサンプル ポイントの値を取得します。ただし、デフォルトでは値は補間された後であり、そうではありません。 Packed-Texture のレンガのインデックスを正しく修正しました。

だから、私の質問は次のとおりです。レイキャスティングレンダリング中にサンプリングを行うとき、インデックステクスチャからパックテクスチャのブリック (サンプルポイントがある) のインデックスを正しく取得する方法は?

4

1 に答える 1

2

これは実際には問題ではありません。ボリューム キューブが [0, 1]³ から始まり、それを各方向に 8 ブロックに分割するとします。次に、小数座標に 8 (または何でも) を掛けて、最も近い整数に切り捨てます。これにより、インデックスが得られます。切り捨てた後、スケーリングされた小数座標からインデックスを減算します。これにより、サブブロック内の小数位置が得られます。つまり、

volcube_pos = volcube_frac_pos * volcube_blocks;
volcube_index = (int)floor(volcube_pos);
subblock_pos = volcube_pos - volcube_index;

これらのブロックはすべてどこかに保存する必要があります。それらを通常のパックされた 3D テクスチャに配置するには、フィルタリングを無効にし、フェンスポストの問題 ( https://stackoverflow.com/a/5879551/524368 ) に注意し、すべてのフィルタリング補間を自分で行う必要があります。

パックされたテクスチャの代わりに別のアプローチとして、私自身を調べてみます。たまたま現在自分自身でボリューム レンダリングに取り組んでいますが、NVidia のバインドレス テクスチャを使用しています。

于 2012-10-24T09:31:10.587 に答える