「ボリュームレンダリング」の版間の差分

提供: MonoBook
ナビゲーションに移動 検索に移動
imported>Administrator
6行目: 6行目:
 
[[コンピューター]]および[[グラフィックボード]]の高性能化により、[[ゲーム]]などの[[ポリゴン]]主体の[[3D]]においても、雲の表現などの古くから[[ビルボード]]という手抜き手法が使われていた部分を高画質化する手法として採用され始めている。
 
[[コンピューター]]および[[グラフィックボード]]の高性能化により、[[ゲーム]]などの[[ポリゴン]]主体の[[3D]]においても、雲の表現などの古くから[[ビルボード]]という手抜き手法が使われていた部分を高画質化する手法として採用され始めている。
  
ボリュームレンダリングにおいて最終的に出力する1つの[[ピクセル]]の値を求めるため、[[ボクセル]]と呼ばれる[[3次元]]の[[ビットマップ]]のようなものから必要な[[データ]]([[配列]])を抽出することを[[レイキャスティング]]という。ボリュームレンダリングでは[[レイキャスティング]]で得られた[[データ]]([[配列]])を[[最大値]]や[[最小値]]、[[平均値]]、[[中央値]]、単純に[[加算]]などの様々な方法により加工することで最終的な映像(1つの[[ピクセル]])を取得する。ただし、レイキャスティングで得た値を即座に[[ピクセル]]に変換する手法が一般的であるため、ボリュームレンダリングとレイキャスティングを同一として語られることも多い。
+
== アルゴリズム ==
 +
ボリュームレンダリングといっても様々な手法があるが、現在ではほぼレイキャスティングを用いたもの一色となっている。
  
ボリュームレンダリングでは[[ピクセル]]単位で[[レイキャスティング]]を行い、その他の要素から影響を受けにくいため、[[GPU]]に搭載される[[ピクセルシェーダー]]([[宗教上の理由]]により[[OpenGL]]の世界では[[フラグメントシェーダー]]と呼ばれる)と非常に相性がよく、近年の壮大な[[GPU]]ではそこそこ高速に処理できるようになりつつある。
+
* [[バイナリ空間分割]]
 +
* [[マーチングキューブ法]]
 +
* [[レイキャスティング]]
  
ただしボリュームレンダリングでは3次元の点の集まりである[[ボクセル]]を扱う関係上、非常に多くの[[メモリ]]を必要とする。
+
== レイキャスティング ==
 +
ボリュームレンダリングで主流となっているレイキャスティングは「[[ボクセル]]」と呼ばれる[[3次元]]の[[ビットマップ]]のような[[データ]]([[配列]])から2次元描画用の[[データ]]を抽出する処理をいう。
 +
 
 +
この[[レイキャスティング]]で得られた[[データ]]([[配列]])をもとに、[[最大値]]や[[最小値]]、[[平均値]]、[[中央値]]、単純に[[加算]]などの様々な方法により加工することで最終的な映像(1つの[[ピクセル]])を取得する。
 +
 
 +
なお、レイキャスティングで得た値を加工せず、即座に[[ピクセル]]に変換する手法が一般的であるため、ボリュームレンダリングとレイキャスティングを同一として語られることも多い。
 +
 
 +
=== 並列処理 ===
 +
ボリュームレンダリングではアプリの表示領域の[[ピクセル]]単位で[[レイキャスティング]]を行う。たとえば縦512x横512の解像度の画像を生成しようと思った場合、「512x512=262144回」のレイキャスティングを行うことになる。ちなみに「より高画質に」という要望の場合には目的の解像度の2倍から16倍程度の解像度の画像を一旦生成し、目的の解像度に縮小するという手法が用いられる。 いわゆる「[[MSAA]]」だね。
 +
 
 +
話は逸れたが「512x512=262144回」は凄い数だ。
 +
 
 +
ただこの処理は一方的なデータの「取得」である。データの「変更」は伴わない。出力先の画像も1ピクセル毎に処理しているので同じメモリ番地に重複して書き込まれることもない。つまり排他制御も何も考えずに並列化できる。
 +
 
 +
昨今のマルチコアな[[CPU]]が簡単に活かせる。また、[[GPU]]に搭載される[[ピクセルシェーダー]]([[宗教上の理由]]により[[OpenGL]]の世界では[[フラグメントシェーダー]]と呼ばれる)とも非常に相性がよく、近年の壮大な[[GPU]]ではそこそこ高速に処理できる。なお、GPUで処理する方法は後述のメモリ消費量が問題になることが多いので注意すること。一般的に[[メインメモリ]]と異なり[[VRAM]]は[[仮想メモリ]]をサポートしない。
 +
 
 +
=== メモリ消費量 ===
 +
ボリュームレンダリングでは3次元の点の集まりである[[ボクセル]]を扱う関係上、非常に多くの[[メモリ]]を必要とする。
  
 
:メモリ消費量
 
:メモリ消費量
16行目: 36行目:
 
:*1024 * 1024 * 1024 * 2バイト = 2GB
 
:*1024 * 1024 * 1024 * 2バイト = 2GB
  
上記は単純に[[ボクセル]]を保持するために必要な最低限のメモリ容量であり、実際にはここから計算した値を確保しておくための[[メモリ]]なども必要になる。このような巨大な[[データ]]は[[メインメモリ]]から[[VRAM]]への転送なども大きな負担となる。[[ゲーム]]などに最適化された[[グラフィックボード]]は[[VRAM]]上に一度[[データ]]を転送したらシーンが変わるまで使い回す前提となっていることが多いため、[[メインメモリ]]と[[VRAM]]の間で大量の転送を行うような用途では[[シェーダー]]が遊んでしまうのである。このためボリュームレンダリングでは[[シェーダー]]の性能よりも[[メモリ]]の容量や速度が[[ボトルネック]]となることが多く、安物の[[オンボードGPU]]では厳しかったりする。なお、[[オンボードGPU]]でも[[PlayStation 4]]のように[[GDDR5]]と[[hUMA]]のような技術を組み合わせればボリュームレンダリングも大きく前進する可能性がある。
+
上記は単純に[[ボクセル]]を保持するために必要な最低限のメモリ容量であり、実際にはここから計算した値を確保しておくための[[メモリ]]なども必要になる。このような巨大な[[データ]]は[[メインメモリ]]から[[VRAM]]への転送なども大きな負担となる。
 +
 
 +
[[ゲーム]]などに最適化された[[グラフィックボード]]は[[VRAM]]上に一度[[データ]]を転送したらシーンが変わるまで使い回す前提となっていることが多いため、[[メインメモリ]]と[[VRAM]]の間で大量の転送を行うような用途では[[シェーダー]]が遊んでしまうのである。
 +
 
 +
このためボリュームレンダリングでは[[シェーダー]]の性能よりも[[メモリ]]の容量や速度が[[ボトルネック]]となることが多く、安物の[[オンボードGPU]]では厳しかったりする。なお、[[オンボードGPU]]でも[[PlayStation 4]]のように[[GDDR5]]と[[hUMA]]のような技術を組み合わせればボリュームレンダリングも大きく前進する可能性がある。
  
 
==関連項目==
 
==関連項目==

2019年7月24日 (水) 05:47時点における版

ボリュームレンダリング英語:volume rendering)とは、3次元のピクセルの集まり(ボクセルという)から強引に3次元映像を作り出す力技のことである。

概要

ボリュームレンダリングは主に放射線の吸収量をコンピューターグラフィックスとして表現する医用画像非破壊検査などの領域で使用されている手法である。ボリュームレンダリングではモデルの表面だけのポリゴンと異なり、モデルの中身まで描き出すことができる。大雑把に言えばマインクラフトで「何か」を作り上げたような感じである。

コンピューターおよびグラフィックボードの高性能化により、ゲームなどのポリゴン主体の3Dにおいても、雲の表現などの古くからビルボードという手抜き手法が使われていた部分を高画質化する手法として採用され始めている。

アルゴリズム

ボリュームレンダリングといっても様々な手法があるが、現在ではほぼレイキャスティングを用いたもの一色となっている。

レイキャスティング

ボリュームレンダリングで主流となっているレイキャスティングは「ボクセル」と呼ばれる3次元ビットマップのようなデータ配列)から2次元描画用のデータを抽出する処理をいう。

このレイキャスティングで得られたデータ配列)をもとに、最大値最小値平均値中央値、単純に加算などの様々な方法により加工することで最終的な映像(1つのピクセル)を取得する。

なお、レイキャスティングで得た値を加工せず、即座にピクセルに変換する手法が一般的であるため、ボリュームレンダリングとレイキャスティングを同一として語られることも多い。

並列処理

ボリュームレンダリングではアプリの表示領域のピクセル単位でレイキャスティングを行う。たとえば縦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のようにGDDR5hUMAのような技術を組み合わせればボリュームレンダリングも大きく前進する可能性がある。

関連項目

参考文献