CUDA+GPGPU、C++、C#などのプログラムについての備忘録がわり
Posted by サンマヤ - 2009.10.01,Thu
しばらくゲームにかまけて更新してませんでしたが、
GPGPUやCUDAに関する関心は高いようでけっこう来訪者が多くて驚いています。
さて、環境が変わったこともあってCUDAからはちょっとはなれていたのですが、
DirectX10のHLSLを使ってGPGPUのようなことをやってみようと思います。
これから備忘録のような感じで少しずつ書いていきます。
まずは新機能のGeometryShaderです。
これまではVertexShaderで頂点ごとの操作を行い、
PixelShaderで点の色を決定するという形であり、
図形的な処理は頂点ごとに定義された法線ベクトルを用いるということでした。
GeometryShaderはこの2つのShaderの間に入り、
図形(Primitive)単位の処理ができるようになったのに加えて、
図形の生成・消滅させることによる操作が可能になっています。
GPGPUやCUDAに関する関心は高いようでけっこう来訪者が多くて驚いています。
さて、環境が変わったこともあってCUDAからはちょっとはなれていたのですが、
DirectX10のHLSLを使ってGPGPUのようなことをやってみようと思います。
これから備忘録のような感じで少しずつ書いていきます。
まずは新機能のGeometryShaderです。
これまではVertexShaderで頂点ごとの操作を行い、
PixelShaderで点の色を決定するという形であり、
図形的な処理は頂点ごとに定義された法線ベクトルを用いるということでした。
GeometryShaderはこの2つのShaderの間に入り、
図形(Primitive)単位の処理ができるようになったのに加えて、
図形の生成・消滅させることによる操作が可能になっています。
SDKのTutorialでは、Tutorial13がGeometryShaderの説明になっています。
これは、もとの図形に爆発させたようなエフェクトを与えるものになっています。
DirectXでの図形描画は、単位図形(Primitive)のデータの列を与えることで行われます。
この例では、もっともよく使われるTriangleStrip、三角形の連鎖を使っています。
GeometryShader部分を見てみましょう。
まずは見慣れないものから始まります。
[maxvertexcount(12)]
これは、1つのGeometryShaderが、最大でいくつの頂点を生成するのか与えています。
並列処理のためにはこういう指定が必要なのでしょう。
次が、宣言部分です。
void GS( triangle GSPS_INPUT input[3], inout TriangleStream<GSPS_INPUT> TriStream )
入力は、三角形なので頂点3つ分、出力は三角形のストリームに追加していく形です。
細部はSDKを見てもらうとして、
TriStream.Append( output );
で、ストリームに頂点を追加し、これを3回行ったうえで、
TriStream.RestartStrip();
の呼び出しで1つの三角形が終わったことを指示します。
この例では、1つの三角形を重心から飛び出した四面体にするので、
1つの三角形が4つの三角形に変換されます。
なので、最初のmaxvertexcountは3×4=12個となっています。
必要とあらば、ここでTriStreamに何も追加しないことで、その図形を消すこともできます。
こうした図形を増減させるような処理は、これまでのHLSLでは難しかったので大きな変化といえるでしょう。
これはGPGPUにHLSLを使う上でも重要な変更だと思います。
これは、もとの図形に爆発させたようなエフェクトを与えるものになっています。
DirectXでの図形描画は、単位図形(Primitive)のデータの列を与えることで行われます。
この例では、もっともよく使われるTriangleStrip、三角形の連鎖を使っています。
GeometryShader部分を見てみましょう。
まずは見慣れないものから始まります。
[maxvertexcount(12)]
これは、1つのGeometryShaderが、最大でいくつの頂点を生成するのか与えています。
並列処理のためにはこういう指定が必要なのでしょう。
次が、宣言部分です。
void GS( triangle GSPS_INPUT input[3], inout TriangleStream<GSPS_INPUT> TriStream )
入力は、三角形なので頂点3つ分、出力は三角形のストリームに追加していく形です。
細部はSDKを見てもらうとして、
TriStream.Append( output );
で、ストリームに頂点を追加し、これを3回行ったうえで、
TriStream.RestartStrip();
の呼び出しで1つの三角形が終わったことを指示します。
この例では、1つの三角形を重心から飛び出した四面体にするので、
1つの三角形が4つの三角形に変換されます。
なので、最初のmaxvertexcountは3×4=12個となっています。
必要とあらば、ここでTriStreamに何も追加しないことで、その図形を消すこともできます。
こうした図形を増減させるような処理は、これまでのHLSLでは難しかったので大きな変化といえるでしょう。
これはGPGPUにHLSLを使う上でも重要な変更だと思います。
PR
Comments
Post a Comment
カレンダー
リンク
カテゴリー
フリーエリア
最新コメント
[11/19 矢野 忠]
[02/25 山本義和]
[07/08 hirota]
[07/06 hirota]
[02/05 矢野 忠]
最新記事
(04/04)
(01/11)
(05/17)
(06/07)
(09/09)
最新トラックバック
プロフィール
ブログ内検索
最古記事
(07/15)
(07/15)
(07/16)
(07/16)
(07/16)
カウンター
忍者アナライズ
Template by mavericyard*
Powered by "Samurai Factory"
Powered by "Samurai Factory"