「ボリュームレンダリング」を編集中

ナビゲーションに移動 検索に移動

警告: ログインしていません。編集を行うと、あなたの IP アドレスが公開されます。ログインまたはアカウントを作成すれば、あなたの編集はその利用者名とともに表示されるほか、その他の利点もあります。

この編集を取り消せます。 下記の差分を確認して、本当に取り消していいか検証してください。よろしければ変更を保存して取り消しを完了してください。

最新版 編集中の文章
7行目: 7行目:
  
 
==アルゴリズム==
 
==アルゴリズム==
ボリュームレンダリングといっても様々な手法があるが、現在ではほぼ[[レイキャスティング]]を用いたもの一色となっており、「ボリュームレンダリング≒ボリュームレイキャスティング」という状況である。
+
ボリュームレンダリングといっても様々な手法があるが、現在ではほぼレイキャスティングを用いたもの一色となっている。
  
* [[バイナリ空間分割]]
+
*[[バイナリ空間分割]]
* [[マーチングキューブ法]]
+
*[[マーチングキューブ法]]
* [[ボリュームレイキャスティング]]
+
*[[レイキャスティング]]
 +
 
 +
==ボリュームレイキャスティング==
 +
[[レイキャスティング]]は「[[ゲーム]]の当たり判定」などのにも使われる汎用的な[[アルゴリズム]]であり、ボリュームレンダリングだけのアルゴリズムではない。これを明確にするために「ボリュームレイキャスティング」と呼ばれることも多い。
 +
 
 +
[[レイキャスティング]]は「[[ボクセル]]」と呼ばれる3次元の[[ビットマップ]]のような[[データ]]([[配列]])からデータを抽出する処理をいう。まず視点位置と描画対象ピクセルのベクトル(レイを伸ばす角度、方向)を求める。これが「レイ」であり、このレイをまっすぐ伸ばし、ボクセルを貫通した位置にあるデータが抽出対象となる。
 +
 
 +
この[[レイキャスティング]]で得られた[[データ]]([[配列]])をもとに、[[最大値]]や[[最小値]]、[[平均値]]、[[中央値]]、単純に[[加算]]など、様々な方法により加工することで最終的な映像(1つの[[ピクセル]])を取得する。この加工方法が重要であり「加工方法≒アルゴリズム名」となっている。
 +
 
 +
* MIP (Maximum Intensity Projection) = 最大値
 +
* MinIP (Minimum Intensity Projection) = 最小値
 +
* RaySum (Ray Summation) = 単純加算、CT値などは相対値なので足し合わせると勝手に平均値になる
 +
* Surface Rendering = 特定範囲の値、かつ最初に出現したもの
 +
* Volume Rendering = 特定範囲の値、かつ不透明度マップを掛けたもの
 +
 
 +
これをひたすら繰り返す。すると最終的に1枚の画像になる。
 +
[[ファイル:Volume-raycasting.png|なし|サムネイル|640x640ピクセル]]
 +
 
 +
===並列処理===
 +
ボリュームレンダリングではアプリの表示領域の[[ピクセル]]単位で[[レイキャスティング]]を行う。たとえば縦512x横512の解像度の画像を生成しようと思った場合、「512x512=262144回」のレイキャスティングを行うことになる。ちなみに「より高画質に」という要望の場合には目的の解像度の2倍から16倍程度の解像度の画像を一旦生成し、目的の解像度に縮小するという手法が用いられる。 いわゆる「[[MSAA]]」だね。
 +
 
 +
話は逸れたが「512x512=262144回」は凄い数だ。
 +
 
 +
ただこの処理は一方的なデータの「取得」である。データの「変更」は伴わない。出力先の画像も1ピクセル毎に処理しているので同じメモリ番地に重複して書き込まれることもない。つまり排他制御も何も考えずに並列化できる。
 +
 
 +
昨今のマルチコアな[[CPU]]が簡単に活かせる。また、[[GPU]]に搭載される[[ピクセルシェーダー]]([[宗教上の理由]]により[[OpenGL]]の世界では[[フラグメントシェーダー]]と呼ばれる)とも非常に相性がよく、近年の壮大な[[GPU]]ではそこそこ高速に処理できる。なお、GPUで処理する方法は後述のメモリ消費量が問題になることが多いので注意すること。一般的に[[メインメモリ]]と異なり[[VRAM]]は[[仮想メモリ]]をサポートしない。
 +
 
 +
===メモリ消費量===
 +
ボリュームレンダリングでは3次元の点の集まりである[[ボクセル]]を扱う関係上、非常に多くの[[メモリ]]を必要とする。
 +
 
 +
:メモリ消費量
 +
:*512 * 512 * 512 * 2バイト = 256MB
 +
:*1024 * 1024 * 1024 * 2バイト = 2GB
 +
 
 +
上記は単純に[[ボクセル]]を保持するために必要な最低限のメモリ容量であり、実際にはここから計算した値を確保しておくための[[メモリ]]なども必要になる。このような巨大な[[データ]]は[[メインメモリ]]から[[VRAM]]への転送なども大きな負担となる。
 +
 
 +
[[ゲーム]]などに最適化された[[グラフィックボード]]は[[VRAM]]上に一度[[データ]]を転送したらシーンが変わるまで使い回す前提となっていることが多いため、[[メインメモリ]]と[[VRAM]]の間で大量の転送を行うような用途では[[シェーダー]]が遊んでしまうのである。
 +
 
 +
このためボリュームレンダリングでは[[シェーダー]]の性能よりも[[メモリ]]の容量や速度が[[ボトルネック]]となることが多く、安物の[[オンボードGPU]]では厳しかったりする。なお、[[オンボードGPU]]でも[[PlayStation 4]]のように[[GDDR5]]と[[hUMA]]のような技術を組み合わせればボリュームレンダリングも大きく前進する可能性がある。
  
 
==関連項目==
 
==関連項目==
* [[ポリゴン]]
 
* [[医用画像]]
 
* [[非破壊検査]]
 
  
 +
*[[ポリゴン]]
 +
*[[医用画像]]
 +
*[[非破壊検査]]
 +
 +
==参考文献==
 +
{{reflist}}
 +
 +
{{stub}}
 
[[カテゴリ:画像処理]]
 
[[カテゴリ:画像処理]]
[[category: 3DCG]]
 

MonoBookへの投稿はすべて、他の投稿者によって編集、変更、除去される場合があります。 自分が書いたものが他の人に容赦なく編集されるのを望まない場合は、ここに投稿しないでください。
また、投稿するのは、自分で書いたものか、パブリック ドメインまたはそれに類するフリーな資料からの複製であることを約束してください(詳細はMonoBook:著作権を参照)。 著作権保護されている作品は、許諾なしに投稿しないでください!

このページを編集するには、下記の確認用の質問に回答してください (詳細):

取り消し 編集の仕方 (新しいウィンドウで開きます)