私は現在、レイキャスティングとボクセルを検討しています。これは素晴らしい組み合わせです。Sebastian ScholzによるVoxelrendererはこれを非常にうまく実装しますが、OpenGLも使用します。彼の公式がどのように機能しているか疑問に思っています。レイキャスティングとボクセルでOpenGLをどのように使用できますか?レイキャスティングのアイデアは、光線がすべてのピクセル(またはライン、つまりDoom)にキャストされ、結果を描画するというものではありませんか?
2 に答える
言及されたレイキャスターはVoxelrendererです。つまり、3Dテクスチャに保存された不透明度のようなボリュームデータを視覚化するメソッドです。Doomのレイキャスティングアルゴリズムには別の目的があります。画面上のすべてのピクセルについて、マップの最初の平面を見つけ、そこにその色を描画します。最新のGPUのラスター化機能により、このレイキャスターの使用は廃止されました。
体積データをリアルタイムで視覚化することは、依然として特殊なハードウェアによって行われるタスクであり、通常、医療および測地線イメージングシステムに見られます。基本的に、これらはボリュームRGBAデータを保持する大量のRAM(数十GB)です。次に、画面上のすべてのピクセルに対して、ボリュームに光線が投影され、RGBAデータがその光線に統合されます。GPU Voxelrendererは、フラグメントシェーダーによって同じことを行います。擬似コード:
vec4f prev_color;
for(i=0; i<STEPS; i++) {
p = ray_direction * i*STEP_DELTA;
voxel = texture3D(volumedata, p);
prev_color = combine(voxel, prev_color);
}
final_color = finalize(prev_color);
finalize
データの種類とcombine
視覚化する内容によって異なります。たとえば、(X線画像のように)密度を統合する場合はcombine
、合計操作で正規化を完了します。クラウドを視覚化する場合は、ボクセル間でアルファブレンドを行います。
ボクセル空間でのレイキャスティングはピクセルを使用しないため、非効率的です。
どのスペースが空で、どのスペースにボクセルキューブがあるかを示す配列がすでにあります。
したがって、高速バージョンは、完全なボクセルに到達するまで、ラインの方向ですべてのボクセルのエンプタイムをチェックするラインをトレースしています。
これには、メモリから数百回の読み取り操作が必要であり、読み取り操作ごとに光線ベクトルを2〜3回乗算する必要があります。
ボクセルの10億のメモリ位置を読み取るには、約1秒かかるため、数百は非常に高速で、常にフレーム内にあります。
レイキャスティングでは、多くの場合、最適化を使用して、数学の数式がスターとなる空間内の小数の場所を検出します。メッシュの頂点は、境界ボックスに基づいており、次にメッシュに基づいています。ボクセルでは、整数配列の行を、空所。