C#は電気羊の夢を見るか?(引っ越し中)

dtiブログが閉鎖とのことでhttp://tanocs.blog.fc2.com/へ引っ越します。

GPGPUの現状

結構とXNAでGPGPUをやりたい方が多いようで、
[XNA GPGPU]をキーにgoogleからの来訪者が多い。

そこで、まぁいいかと放ったらかしにしていた現状について話さざるをえない・・・。

というのも、じつは公開中のGPGPUのソースははっきり言って全然使いものにならない。
なぜならピクセルシェーダーを使ってるから。

ピクセルシェーダーはほとんど処理が並列化されないので、
GPGPUの利点を生かしきれない。と思う。
GPGPUとしてピクセルシェーダーは遅いと思っていた要因が別にある可能性があり、
厳密な計測や比較が出来ていないから断定はできない。

ただ、応用の基礎として読み取るには調度良いわかりやすさがあるので、
そのままにしているのだが、実際はそのままでは実用には耐えないと思われる。


GPGPUとして本格的に使用したい場合はバーテクスシェーダーを用いる必要がある。
バーテクスシェーダーを使うにはいくつかの”コツ”がいる。

そのコツは以下の通り
・VertexElementを自前で定義する
 色情報や法線情報として自分が計算したいと思っている大量のデータを
 バーテクスシェーダーに渡すようにする。
 その際、位置情報は出力するレンダーターゲットの座標を表すようにする。

 ちなみにその座標は左上が(-1,1,0),右下が(1,-1,0)として指定する。
 取り得る値の範囲が-1〜1で、何故かXとYが反転する点に注意が必要

例:1024 * 1024のレンダーターゲットの場合
   (1024, 1024) → (1, -1, 0)
   (512, 256) → (0, 0.5, 0)
   (256, 0) → (-0.5, 1, 0)
   

・頂点を点として描画する
 graphics.RenderState.FillMode = FillMode.Point;
 graphics.RenderState.PointSize = 1;
 上記のようにレンダーステートを点描画モードにしてやる。

 通常のGPGPUでは必要ないと思うけど、
 計算結果を3Dモデルで表示したいとかで、通常の描画に戻したいときは
 graphics.RenderState.FillMode = FillMode.Solid;
 とすればいい


具体的なソースの提示はいつかしたいと思っているが、
いかんせん、高速化の名目で現在作成中のプログラムに密結合しているので
引き剥がしてサンプル化するのに手間がかかってしまうのでとりあえずで勘弁して下さい。

このエントリーをはてなブックマークに追加
LINEで送る

コメント

コメントの投稿

管理者にだけ表示を許可する

トラックバック

http://t01a.dtiblog.com/tb.php/123-e2371f27

« GPGPUの高速化  | HOME |  シェーダについて »

PAGE TOP ▲

Appendix

■春条

■春条

生息地は愛知
車と甘い物が好きな31歳
特技は無限昼寝

MONOからSharpDXを使う
変態的な手法で、
.NET Frameworkを使わずに
ゲーム作りやってます。

Search

Calender

« | 2018-08 | »
S M T W T F S
- - - 1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31 -

Twitter

Recent Entries

DTIブログポータルへ
このブログを通報
Report Abuse

利用規約