CUDAでMC法
をテンプレートにして作成
[
トップ
|
新規
|
一覧
|
検索
|
最終更新
|
ヘルプ
]
開始行:
*CUDAでMarching Cube法 [#g5e1f9e1]
Marching Cube法((Lorensen, W. E. and Cline, H. E. "Marchi...
は流体シミュレーションなどで得られた陰関数曲面から
三角形メッシュを作成する手法である.手順は以下.
+立方体グリッド(Cube)を空間に配置
+各Cubeの辺上で陰関数値が0となる点を線型補間や二分法,ニ...
+Cubeに含まれる点の配置と数から三角形メッシュを生成
より詳しい手順やソースコードは以下のサイトを参考に.
-http://local.wasp.uwa.edu.au/~pbourke/geometry/polygonise/
CUDAのSDK内に含まれるサンプルにMC法のCUDA実装がある.
ここではそれについて解説する.
**サンプルの場所 [#p5a1d092]
MC法のCUDAサンプルは
(SDKインストールフォルダ)\C\src\marchingCubes
にあります.Visual Studioの場合,(SDKフォルダ)\C\src以下...
それを開くと全サンプルのプロジェクトを含んだソリューショ...
その中の"marchingCubes"プロジェクトがMC法のサンプルである.
**ファイル構成 [#d9e62cf1]
-defines.h : marchingCubes_kernel.cuでインクルードされる...
-marchingCubes.cpp : メインファイル
-marchingCubes_kernel.cu : MC法カーネル,デバイス関数など...
-tables.h : Cube内のメッシュ構成判定テーブルなど
これらの他に,FBOの管理などを行うrendercheck_gl.h, render...
nvShaderUtils.h などが用いられている.
これらのファイルは (SDKフォルダ)\C\common\inc\ にヘッダが...
また,Prefix sum(Scan)を行うために,[[CUDPP:http://gpgpu....
**元データ [#k0dea681]
メッシュ化する陰関数値はこのサンプルではデバイス関数とし...
これらは define.h の
#define SAMPLE_VOLUME 1
で切り替えられる.
**処理の流れ [#m856ec77]
CUDAによるメッシュ化は,marchingCubes.cpp内の computeIsos...
手順としては,
+グリッドごとにCube 8頂点の関数値を調べ,Cubeごとのメッシ...
この処理を行うカーネル関数は classifyVoxel で,カーネルス...
カーネル関数内の処理手順は,
++グリッド8頂点の関数値を field[8] に格納
++8頂点の関数値が閾値より大きいか,小さいかを各ビットの値...
++テーブル numVertsTable (テクスチャ numVertsTex) をcubei...
++uint型配列 d_voxelOccupied にボクセル内に頂点があれば1,...
+(空のボクセルを以降の処理でスキップする場合のみ)グリッド...
(結果は d_voxelOccupiedScan),メッシュを生成するべきグリ...
d_compVoxelArray を生成する.ScanにはcuDPPライブラリのcud...
cudppScan関数によりScanされた結果 d_voxelOccupiedScan の...
exclusive scanを用いているので要素の数をnとすると0からn-2...
これに d_voxelOccupied 配列の最後の値(n-1番目の値)を足す...
そして,d_voxelOccupiedScanに従い,空でないグリッドについ...
d_compVoxelArray[ d_voxelOccupiedScan[i] ] = i;
の処理を行うカーネル関数 compactVoxels を numVoxels 個の...
+手順2と同様にして,グリッドの頂点数 d_voxelVerts につい...
最後の要素を参照することで,総頂点数 totalVerts を得る.
+結果の頂点位置,法線をOpenGLのVBOに格納するために,cudaG...
+(空でない)グリッドごとにメッシュ頂点座標,頂点の並びを計...
この処理を行うカーネル関数は陰関数の参照に関数を用いる場...
サンプルボリュームを用いる場合は,generateTriangles2 で,...
空でないグリッド数(activeVoxels),そうでない場合は,グリ...
カーネル関数内の処理は,
++各グリッドの8頂点座標 v[8] を参照
++1と同様に8頂点の関数値 field[8] を求め,テーブル参照用...
++v と field の値から12辺について陰関数値の線型補間により...
++グリッド内のメッシュ数は頂点数/3になるので,cubeindexか...
+++各メッシュがどの頂点から構成されるかの情報をテーブル t...
+++vertlist[edge]を参照することで3頂点座標を取得(v[3])
+++3頂点座標より外積で法線を算出(calcNormal関数)
+++結果を配列 pos, normにそれぞれ格納
+cudaGLUnmapBufferObject()によりVBOのマップを外す.
このサンプルでは,メッシュ頂点座標をメッシュごとに並べた...
これはglDrawArrays で描画する場合は便利ではあるが,
メッシュを保存してモデリングしたり,レンダリングする際に...
これについては別のページで実装を述べる.
また,環境にもよるが,cudaGLMapBufferObject, cudaGLUnmapB...
あらかじめ確保していたデバイスメモリ上に直接結果を書き込...
**Prefix sum (Scan)とは [#k4d4640f]
大きさnのある配列aがあったときScanは以下のようになる.
Inclusive scan : [a[0], a[0]+a[1], a[0]+a[1]+a[2], ... ,...
Exclusive scan : [0, a[0], a[0]+a[1], a[0]+a[1]+a[2], .....
Scanはデータパラレルプログラミングで良く用いられる.
より詳しくは,
-[[Prefix sum:http://en.wikipedia.org/wiki/Prefix_sum]](W...
を参照.また,CUDAによる並列Scanについては以下参照.
-[[Parallel Prefix Sum (Scan) with CUDA:http://developer....
終了行:
*CUDAでMarching Cube法 [#g5e1f9e1]
Marching Cube法((Lorensen, W. E. and Cline, H. E. "Marchi...
は流体シミュレーションなどで得られた陰関数曲面から
三角形メッシュを作成する手法である.手順は以下.
+立方体グリッド(Cube)を空間に配置
+各Cubeの辺上で陰関数値が0となる点を線型補間や二分法,ニ...
+Cubeに含まれる点の配置と数から三角形メッシュを生成
より詳しい手順やソースコードは以下のサイトを参考に.
-http://local.wasp.uwa.edu.au/~pbourke/geometry/polygonise/
CUDAのSDK内に含まれるサンプルにMC法のCUDA実装がある.
ここではそれについて解説する.
**サンプルの場所 [#p5a1d092]
MC法のCUDAサンプルは
(SDKインストールフォルダ)\C\src\marchingCubes
にあります.Visual Studioの場合,(SDKフォルダ)\C\src以下...
それを開くと全サンプルのプロジェクトを含んだソリューショ...
その中の"marchingCubes"プロジェクトがMC法のサンプルである.
**ファイル構成 [#d9e62cf1]
-defines.h : marchingCubes_kernel.cuでインクルードされる...
-marchingCubes.cpp : メインファイル
-marchingCubes_kernel.cu : MC法カーネル,デバイス関数など...
-tables.h : Cube内のメッシュ構成判定テーブルなど
これらの他に,FBOの管理などを行うrendercheck_gl.h, render...
nvShaderUtils.h などが用いられている.
これらのファイルは (SDKフォルダ)\C\common\inc\ にヘッダが...
また,Prefix sum(Scan)を行うために,[[CUDPP:http://gpgpu....
**元データ [#k0dea681]
メッシュ化する陰関数値はこのサンプルではデバイス関数とし...
これらは define.h の
#define SAMPLE_VOLUME 1
で切り替えられる.
**処理の流れ [#m856ec77]
CUDAによるメッシュ化は,marchingCubes.cpp内の computeIsos...
手順としては,
+グリッドごとにCube 8頂点の関数値を調べ,Cubeごとのメッシ...
この処理を行うカーネル関数は classifyVoxel で,カーネルス...
カーネル関数内の処理手順は,
++グリッド8頂点の関数値を field[8] に格納
++8頂点の関数値が閾値より大きいか,小さいかを各ビットの値...
++テーブル numVertsTable (テクスチャ numVertsTex) をcubei...
++uint型配列 d_voxelOccupied にボクセル内に頂点があれば1,...
+(空のボクセルを以降の処理でスキップする場合のみ)グリッド...
(結果は d_voxelOccupiedScan),メッシュを生成するべきグリ...
d_compVoxelArray を生成する.ScanにはcuDPPライブラリのcud...
cudppScan関数によりScanされた結果 d_voxelOccupiedScan の...
exclusive scanを用いているので要素の数をnとすると0からn-2...
これに d_voxelOccupied 配列の最後の値(n-1番目の値)を足す...
そして,d_voxelOccupiedScanに従い,空でないグリッドについ...
d_compVoxelArray[ d_voxelOccupiedScan[i] ] = i;
の処理を行うカーネル関数 compactVoxels を numVoxels 個の...
+手順2と同様にして,グリッドの頂点数 d_voxelVerts につい...
最後の要素を参照することで,総頂点数 totalVerts を得る.
+結果の頂点位置,法線をOpenGLのVBOに格納するために,cudaG...
+(空でない)グリッドごとにメッシュ頂点座標,頂点の並びを計...
この処理を行うカーネル関数は陰関数の参照に関数を用いる場...
サンプルボリュームを用いる場合は,generateTriangles2 で,...
空でないグリッド数(activeVoxels),そうでない場合は,グリ...
カーネル関数内の処理は,
++各グリッドの8頂点座標 v[8] を参照
++1と同様に8頂点の関数値 field[8] を求め,テーブル参照用...
++v と field の値から12辺について陰関数値の線型補間により...
++グリッド内のメッシュ数は頂点数/3になるので,cubeindexか...
+++各メッシュがどの頂点から構成されるかの情報をテーブル t...
+++vertlist[edge]を参照することで3頂点座標を取得(v[3])
+++3頂点座標より外積で法線を算出(calcNormal関数)
+++結果を配列 pos, normにそれぞれ格納
+cudaGLUnmapBufferObject()によりVBOのマップを外す.
このサンプルでは,メッシュ頂点座標をメッシュごとに並べた...
これはglDrawArrays で描画する場合は便利ではあるが,
メッシュを保存してモデリングしたり,レンダリングする際に...
これについては別のページで実装を述べる.
また,環境にもよるが,cudaGLMapBufferObject, cudaGLUnmapB...
あらかじめ確保していたデバイスメモリ上に直接結果を書き込...
**Prefix sum (Scan)とは [#k4d4640f]
大きさnのある配列aがあったときScanは以下のようになる.
Inclusive scan : [a[0], a[0]+a[1], a[0]+a[1]+a[2], ... ,...
Exclusive scan : [0, a[0], a[0]+a[1], a[0]+a[1]+a[2], .....
Scanはデータパラレルプログラミングで良く用いられる.
より詳しくは,
-[[Prefix sum:http://en.wikipedia.org/wiki/Prefix_sum]](W...
を参照.また,CUDAによる並列Scanについては以下参照.
-[[Parallel Prefix Sum (Scan) with CUDA:http://developer....
ページ名: