連載
.NET&Windows Vistaへ広がるDirectXの世界

第7回 プログラマブル・シェーダによる積極的なGPUの活用

NyaRuRu
Microsoft MVP Windows - DirectX(Jan 2004 - Dec 2007)
2007/05/08

Back Issue
1
DirectXの真実
2
DirectXマスターを目指すあなたが持つべき視点
3
.NET開発者のためのDirectX連携手法
4
XNA Game Studio Expressを触ってみよう!
5
ゲーム開発者にとってのビルド作業とは?
6
.NETアプリを軽快にするためのガベージ・コレクション講座

 連載最終回となる今回は、いよいよGPUを利用したプログラミングについて取り上げる。XNA Game Studio Express(以下 XNA GSE)を利用してマンデルブロ集合のリアルタイム描画を行うことで、CPUとGPUの間でのデータ交換の仕組みとHLSL(High Level Shader Language、上位シェーダ言語)によるシェーダ・プログラミングの基礎について学ぶ。

はじめに

 Windows Vistaの登場により、GPUはPCの標準的なデバイスとして今後普及していくだろう。そんないまこそ、GPUのプログラミングを始める良いタイミングである。

 過去数年間、GPUベンダやゲーム開発者たちは、GPUのためのプログラミング言語やデバッグ手段などについて試行錯誤と議論を積み重ねてきた。そして現在、ポリゴン・ベースのリアルタイム3Dプログラミングは、コンセプト、方法論ともに一定の合意に近づきつつある。XNA GSEによって、ぐっと容易になったGPUプログラミングに挑戦してみよう。

トピックの由来とサンプル・コード

 今回取り上げるマンデルブロ集合の描画というトピックは、XNAチームのShawn Hargreaves氏のBlogに投稿された「Sixty fractals per second」というエントリにヒントを得ている。

 ゲーム・プログラミングの世界でシェーダ・プログラミングというと3Dの照明技術や画像効果に関するトピックが多いが、今回あえて3Dと関係のないトピックを選んだのは、実際にXbox360の計算能力を見てもらうにはマンデルブロ集合のような数列計算の方が分かりやすいと考えたからだ。そして何より、筆者がHargreaves氏のサンプルを動かしていて純粋に楽しめたという理由も大きい。Xbox360でXNAを実行できる方は、ぜひ60FPSでマンデルブロ集合の世界を自由に探索してみていただきたい。

 本記事では、氏のコードを参考にしつつ、描画の流れを説明するために新しく書き下ろしたサンプル・コードを使用する。分量の都合上、コードすべてを載せることができないため、プロジェクト・ファイルをダウンロードできるようにした。なお、実行にはシェーダ・モデル3.0以上に対応したビデオ・カードか、Xbox360が必要である。サンプル2とサンプル3は、キーボードまたはXbox360のコントローラで操作できる。キーボードは、カーソル・キーで移動、[PageUp]/[PageDown]キーで拡大/縮小する。

画面全体をピクセル・シェーダで塗りつぶすサンプル・プログラム
  • サンプル2
     ピクセル・シェーダでマンデルブロ集合を描画する。
ピクセル・シェーダでマンデルブロ集合を描画するサンプル・プログラム
  • サンプル3
     サンプル2の改良版。本記事では解説しない。
サンプル2の改良版(本記事では解説しない)

 実行環境をお持ちの方は、まずはプログラムの方を動かしていただいて、雰囲気をつかんでから以下の記事を読んでいただければ、より理解が深まることだろう。

【コラム】XNA GSE 1.0 Refreshの登場とXNA Creators Club Onlineの拡充

 待望のXNA GSEの初アップデートが、2007年4月24日、XNA GSE 1.0 Refreshとして公開された。

 このアップデートでは、Windows Vistaへの正式対応をはじめとした数多くの改良とバグフィックスが行われている。リリースノートは英語だが、日本のXNAチームのBlogで簡単な解説が行われているので目を通しておくとよいだろう。

 本記事でも、XNA GSE 1.0 Refreshの新機能であるパッケージ機能をさっそく活用してみることにした。今回の更新で、XNA GSEのGUIからゲームのバイナリ・ファイルのパックを行い、ほかの開発者に簡単に配布できるようになった。さらにパッケージ・ツールはコンソール版も用意されており、外部の自動ビルドの仕組みと組み合わせることもできる。

本記事のサンプル・プログラムを展開したところ
本記事のサンプル・プログラムには、Xbox360用のゲーム・パッケージ、Windows用のゲーム・パッケージ、そしてソース・コードが含まれている。
ゲーム・パッケージをダブルクリックすると、Xbox360用かWindows用かに合わせて適切な場所に自動的に配置が行われる。ありがたいことに、XNA GSEを起動することなくXbox360に配置が可能になった(ただしXboxへの配置にはPC環境にはXNA GSEがインストールされている必要がある)。
詳しくはXNA GSE付属のヘルプの『Using XNA Game Studio Express > Sharing Your Game Package > Sharing Your Game Package』のトピックを参照してほしい。
 
Sample3-Xbox360.ccgameを実行してみたところ
Xbox360をConnnect To Computerの状態にしておき、ここでUnpackを選択すると、自動的にゲームがXbox360に配置される。
なお、ここで表示されているアイコンも今回の更新で設定できるようになったものが表示されている。

 また、Xbox360を持っていないという読者の方にとっても、XNA Creators Club Onlineの最近の更新は注目に値するだろう。Creators Club Onlineでは、多数の記事やサンプル・コードが無償公開されている。これらのサンプルは、Xbox360を入手したり有料会員になったりしなくても、Shader Model 2.0または3.0をサポートしたWindows VistaやWindows XP環境があれば実行できるのだ。普段ゲーム・プログラミングに縁がないという人にとっても、C#でどのようにゲームが実装されているのか眺めてみるよいチャンスだろう。

Racing Gameスターター・キット
以前XNA Racerと呼ばれていたサンプル・プログラムが、Creators Clubで公開された。
Racing Gameスターター・キットは、Creators Club内のスターター・キットのページからVisual Studio用のコンテンツ・インストーラの形でダウンロードが可能で、インストールするとXNA GSEの新規プロジェクトにテンプレートとして追加される。
ソース・コードやコンテンツ・ファイルなど、ゲームの作成に必要なすべてのファイルを含んだ本格的なサンプルとなっている。
ちなみにXbox360環境ではいわゆるハイデフ解像度で60FPSを達成している。C#によるリアルタイム・ゲームで「ここまでできる」という1つの指標になるだろう。
この規模のゲームでたとえばGCの発生頻度はどうだろうか? 興味がある方は第6回記事を参考にぜひ自分の目で確かめてみてほしい。

 まずは大まかな描画の流れから見ていこう。


 INDEX
  .NET&Windows Vistaへ広がるDirectXの世界
  第7回 プログラマブル・シェーダによる積極的なGPUの活用
  1.トピックの由来とサンプル・コード
    2.描画の流れ(1)
    3.描画の流れ(2)
    4.描画の流れ(3)
    5.描画の実行
 
インデックス・ページヘ  「.NET&Windows Vistaへ広がるDirectXの世界」


Insider.NET フォーラム 新着記事
  • 第2回 簡潔なコーディングのために (2017/7/26)
     ラムダ式で記述できるメンバの増加、throw式、out変数、タプルなど、C# 7には以前よりもコードを簡潔に記述できるような機能が導入されている
  • 第1回 Visual Studio Codeデバッグの基礎知識 (2017/7/21)
     Node.jsプログラムをデバッグしながら、Visual Studio Codeに統合されているデバッグ機能の基本の「キ」をマスターしよう
  • 第1回 明瞭なコーディングのために (2017/7/19)
     C# 7で追加された新機能の中から、「数値リテラル構文の改善」と「ローカル関数」を紹介する。これらは分かりやすいコードを記述するのに使える
  • Presentation Translator (2017/7/18)
     Presentation TranslatorはPowerPoint用のアドイン。プレゼンテーション時の字幕の付加や、多言語での質疑応答、スライドの翻訳を行える
@ITメールマガジン 新着情報やスタッフのコラムがメールで届きます(無料)

注目のテーマ

Insider.NET 記事ランキング

本日 月間