Direct3D - みる会図書館


検索対象: 月刊 C MAGAZINE 2001年2月号
184件見つかりました。

1. 月刊 C MAGAZINE 2001年2月号

結局公開されているインタフェイスとし ては TabIe 2 に示す 12 種類しかありません。 しかも , これらの中で必要となるのはごく 限られたインタフェイスだけであり , その ほかのインタフェイスも , それぞれの基本 インタフェイスとその派生が含まれている ので , 概念的にはデバイスとリソースと , フレームバッフアの 3 つしかないことになり ます。 これらの主要な 6 つのインタフェイスに ついてそれぞれ説明しておきます。 1 . IDirect3D8 3D 描画すべての根幹となるインタフェイ スです。基本的には抽象クラスであり , そ の機能の実装は後述するデバイスオプジェ クトに任されています。 Direct3D8 オプジェ クト自体はマルチサンプリング機能の有無 やそのほかビデオポードに依存しそうな機 能のサポート情報へのアクセスなどを提供 しています。このインタフェイスは単純に Direct3D8Create ( ) をコールすることで引き 出すことが可能です。 2. lDirect3DDevice8 Direc D デノヾイスは , レンダリングを統 括するオプジェクトです。機能的には変換 処理 (Transformation) , ライティング , ラ スタライズのすべてを制御しており , 保持 されているレンダリング設定情報 ( レンダリ ングステート : Rendering State) に沿って画 像を生成していきます。レンダリングに関 するすべての設定がここでされるため , のレンダリングステートは非常に多くのパ ラメータを持っています。すべてについて 細かく指定する必要はなく , そのほとんど はデフォルト設定値で問題ないと思われま すが , シーンによって変化させる場合には 以前のバージョンと同じく SetRenderState メソッドにより設定していくことになりま す。以前は独立して管理されていたビュー ポート ( Ⅵ ewpo れ ) や光源オプジェクトなど もすべてこのデバイスの中にステートとし イ 0 C MAGAZINE 2001 2 て包含されており , SetViewport ( ) や SetL ight ( ) などのメソッドを用いて機能の設定 を行います。 すべてのメソッドについて解説すること は誌面の都合上できませんが , まとめると 次のような制御を行っています。 ・カーソルの管理 ・コンポーネントオブジェクトの生成機 能 ・テパイスステートの管理 ・ガンマ値の制御 ・高次プリミティブ ( パッチ ) の描画 ・頂点インデックスの管理 ・デバイス自体の情報の保持 ・光源処理 ・マテリアル制御 Fig. 4 Direct3D の構造 (DirectX8 SDK のドキュメントより抜粋 ) IDirect3D8 テクスチャの作成 C 「 eateVoIumeTexture( ) CreateTexture( ) C 「 eateCubeTexture( ) サーフェスの作成 C 「 eatelmageSurface( ) C 「 eateDepthStencilSurface( ) CreateRenderTarget( ) サーフェスの操作 CopyRects( ) SetRende 「 Target( ) テクスチャの使用 SetTextu 「 e( ) リソースの操作 UpdateTexture( ) 頂点 / インテックスパッファ CreateVertexBuffer( ) CreatelndexBuffer( ) lDirect3DVolumeTexture8 lDi 「 ect3D8Volume8 Direct3DTexture8 lDi 「 ect3D8Su 「 face8 ( ミップレベル ) IDirect3DCubeTexture8 lDi 「 ect3D8Surface8 ( フェースレベル ) lDi 「 ect3D8Surface8 ( イメージサーフェス ) lDirect3D8Surface8 ( レンダリンクターゲット ) lDi 「 ect3D8Surface8 ( 深度ステンシル ) jDirect3DSwa Chain8 lDi 「 ect3D8Surface8 ( バックバッファ ) lDirect3DVertexBuffe 「 8 lDi 「 ect3DIndexBuffer8

2. 月刊 C MAGAZINE 2001年2月号

特集 2 Dire tX8 徹底解説 PART ・ 2 DirectX G 「 aphics の実践的プログラミング DirectX 8 では , 3D と 2D が融合して Di 「 ectX Graphics になり , 初期化などを 簡素化したことが特徴となっています。 本章ではこの DirectX Graphics でポイ ントとなるところを紹介し , 実際に簡単 な 3D プログラムを作成しながら , 変更 された点などについて解説します。 はじめに 前章でも説明したようにグラフィックス を統括する DirectX Gr 叩 hics は , 2D 描画を 管理する DirectDraw と 3D 処理を管理する D irec D が融合したものです。 そもそも Direc Ⅸ 8 ではその実装を大きく 作り変えることで , より高速に , よりコン パクトに仕上げることを達成しています。 プログラムを組む側から見ても非常に簡単 に 3D の絵を描画するルーチンを書くことが できるようになりました。これは以前のバ ージョンから Direc Ⅸに触れてきたプログラ TabIe 2 Di 「 ectX G 「 aphics のインタフェイス群 Kotetsu マから見れば信じられないくらいの利便性 を達成しています。本章では , その使いや すさが向上し , かっ性能も大きくアップし た DirectX Graphics の実際のプログラミン グについて , サンプルを使いながら説明を していきたいと思います。 扱う機能について 本来ならば本章では , DirectX 8 の新機能 についてのサンプルを作成し , 実際に動か してみながらその動作を理解する予定だっ たのですが , いかんせん現段階 ( 2000 年 12 月末 ) において , 目玉機能をサポートして いるビデオポードが登場しませんでした。 ソフトウェアでの処理の場合 , シーンを描 画するのに時間をいとわないのであれば問 題はありませんが , ゲームなどのリアルタ イム性を非常に重要視するアプリケーショ ンでは実用的であるとはいえません。とは いえアプリケーション側で高機能なライプ ラリを用意する必要がなく , 単純な API や ラッパ関数を使うだけで高次プリミテイプ 役割 lnte 「 face lDi 「 ect3D8 lDi 「 ect3DDevice8 lDirect3DResou 「 ce8 lDi 「 ect3DTextu 「 e8 lDirect3DBaseTexture8 lDi 「 ect3DCubeTextu 「 e8 lDirect3DVolume8 lDirect3DVolumeTexture8 lDirect3DVertexBuffer8 lDi 「 ect3DlndexBuffe 「 8 lDirect3DSurface8 lDi 「 ect3DSwapChain8 デバイス関係 スワップチェイン , フリップチェインの管理 フレームサーフェスの管理 フレームバッファ インデックスパッファ 頂点バッファ ボリュームテクスチャ ボリュームテクスチャの管理 キュープテクスチャ テクスチャリソースの基本インタフェイス テクスチャの管理 リソース全体の基本インタフェイス リソース関係 デバイスの実装クラスインタフェイス 3D テパイスの基本クラスインタフェイス 描画や頂点モーフィングなどの高機能を実 現できるのは大きな利点ではあります。 そこで今回は , 簡潔化されてスリムにな ったプログラミングの流れを解説して , Dir ectX 8 プログラミングに慣れていただくこ とに主眼を置いてみました。今までの実装 からは大きく変化を遂げているので , 今回 からの新しい型についてサンプルを追って 説明します。また新機能を実装したビデオ ポードが市場に出た段階で , これらを動か すプログラミングについて取り上げられた らと思っています。 シンプルに改善された DirectX Graphics に含まれる Direc D の構造について説明し ます。また同時に , 今回から導入されたリ ソースの概念について第 ps を兼ねた詳しい 説明を行ってみましよう。 Direct3D の構造 Direct3D ではすべての 3D 描画を統括する Direct3D8 オプジェクトを基点として , 機 能ごとに複数の子オプジェクトを集約して 生成することで 1 つの大きなグラフィック 処理系を構築しています。その関連図を Fig. 4 に示します ( Direc Ⅸ 8SDK のドキュメント より抜粋 ) 。これまでは 3D 描画に必要なコ ンポーネントはすべて独立したインタフェ イスを形成していましたが , DirectX8 では これらがすべて IDirect3DDevice インタフェ イスに集約されており , このデバイスオプ ジェクトがすべてのレンダリング情報を保 持していて一元管理しています。ハードウ ェア機能のオン / オフなどはこのレンダリ ングステートの設定を変えることで行いま す。 DirectX Graphics の構造 特集 2 Directx 8 の徹底解説 39

3. 月刊 C MAGAZINE 2001年2月号

とにしましよう。 V1suaI Basic への対応は DirectX 7 から始 まりましたが , このとにきは一部の機能が Visual Basic 向けに提供されただけでした 今回のバージョンアップでは , 各コンポー ネントとも VrsuaI Basic への対応が大幅にな こでは V1sual Basic への対応 されました。 状況についても解説していきます。 また , 本誌付録 CD - ROM には日本語版ド キュメントファイルを含む DirectX 8 SDK が収録されています。こちらもあわせてご 利用ください。 DirectX Graphics DirectX 7 までの DirectX におけるグラフィ ック系コンポーネントは , DirectDraw と Dir ect3D の 2 つが存在していました。 DirectDra w は Wrndows 上で DOS 並のグラフィック操 作環境を提供すべく開発されたもので , Ga me SDK と呼ばれていた時代から 2D グラフ ィック専用の API としてバージョンアップ を重ねてきました。一方 Direct3D は DirectX 2 で追加されたコンポーネントです。 Direct Draw のサーフェスに対してポリゴン描画を 行う API でした。 これら 2 つのコンポーネントが今回の Dire c Ⅸ 8 へのバージョンアップによって , Direc Ⅸ Graphics という 1 つのコンポーネントと して統合されることになりました。 3D と 2D が完全に統合され , 最初から Direct3D8 オ プジェクトなどとして提供されています。 すべての描画用クラスはこのオプジェクト を基点に集約されていくことになります。 これにより , 今まで煩雑だった Direc D オ プジェクトの初期化ルーチンが驚くほど簡 潔になりました。 DirectX Graphics では , このように Direct Draw の一部機能がなくなり , 主に 3D の描 画機能を提供する「 Direct3D 」をはじめ , Di rect3D のヘルバー機能である「 Direct3DXJ が用意されています。 32 C MAGAZINE 2001 2 統合の経緯 DirectX Graphics として統合されたのに はきちんとした経緯があります。まずこ では Direct3D の機能強化とハードウェアの 変化を追いながら , なぜ DirectX Gr 叩 hics に至ったかを振り返ってみたいと思います。 DirectX 2 で Direct3D がサポートされた当 時 , グラフィックポードは 2D 専用の一般の グラフィックポードと , 3D 描画機能を持つ 3D アクセラレータと呼ばれるポードの 2 枚 から構成されていました。つまり 2D のデバ イスと 3D のデバイスがべつべつであるため に , それぞれを別にソフトウェアからも扱 わなくてはならなかったのです。しかし CP U 性能の向上に伴い , グラフィックポード も飛躍的に性能が向上したため , 今日では グラフィックポードといえば必ず 3D アクセ ラレータが載っているという状況になりま した。 現在では 3D を駆使したゲームが大量に作 成されるようになり , 市場では 3D ゲームが 主流へと移り変わってきました。始めは , DirectDraw に 3D 機能を加えるための Direct Fig. 1 初期化する手順の違い ・ DirectX7 3D だったのが , Direct3D を使うための Dire ctDraw という位置付けに変わっていったの です。 こうなると , Direc D を使いたいのに わざわざ相性の問題を意識しながら DirectD raw を初期化しなければならないという手 間は非常に煩わしいものとなります。グラ フィックポードに 3D アクセラレータが統合 されたハードウェア環境において , わざわ ざ DirectDraw と Direct3D を分割する必要は ないのです。 こうして DirectDraw と Direct3D はハ ウェアの変化に対して正確に適応した形で DirectX Gr 叩 hics として生まれ変わったの です。 DirectX Graphics の位置付け こまで読まれると , DirectX Graphics において , DirectDraw は 3D が主流になった 今日の環境で切り捨てられたのかと思われ るかもしれません。事実 DirectX Graphics には DirectDraw の面影はサーフェスのイン タフェイスしか見られません。しかもその インタフェイスには Blt などのビットプロッ Di 「 ectD 「 aw7 + Di 「 ect3D7 を初期化する場合 ・ DirectDraw7 オブジェクトの作成 ・ Di 「 ectDraw の協調レベルの設定 ・ Di 「 ect3D7 インタフェイスの取得 ・プライマリサーフェスの作成 ・セカンダリサーフェスの作成 ・クリッパーの作成 ・ Z バッフアの作成 ・ Direct3DDevice7 の作成 ・レンダリングターゲットの設定 ・ビューポートの設定 ・ DirectX 8 Di 「 ectX G 「 aphics を初期化する場合 ・ Di 「 ect3D8 オブジェクトの作成 ・ Di 「 ect3DDevice8 の作成

4. 月刊 C MAGAZINE 2001年2月号

・深度バッファ , ステンシルバッフアの 管理 ・テクスチャ管理 ・クリップの設定 ・ビューポートの管理 ・頂点シェーダ ・そのほか 3.IDirect3DResource8 DirectX 8 から , バッフアやテクスチャオ プジェクトがすべてリソースという基本概 念にまとめられ , この基本クラスから派生 されるようになりました。リソースには頂 点バッファ (Vertex Buffer) やインデックス バッフアを派生する IDirect3DResource8 と いう基本インタフェイスと , キューブマッ プやポリュームテクスチャを含む一群のテ クスチャクラスの元となる IDirect3DTextur e8 インタフェイスの 2 つがあります。これら リソースの使い方 (D3DUSAGE) TabIe 3 ・パレット関連の制御 ・ピクセルシェーダ ・画面の出力 (Present) ・レンダリング (DrawPrimitive, ctPatch など ) ・シーンの管理 (BeginScene, e) ・頂点ストリームの管理 D3DUSAGE_RTPATCH ES D3DUSAGE_NPATCHES D3DUSAGE_DONOTC 凵 P D3DUSAGE_WRlTEONLY DrawRe EndScen の個別のリソースはすべて IDirect3DDevice 8 から生成することができます ( 前述の Fig. 4 大日の - 彡・イ、、 0 4. lDirect3DTexture8 キューブマップ用のテクスチャやポリュ ームテクスチャ以外の普通のテクスチャを 扱うインタフェイスです。デバイスの Creat eTexture() メソッドを使って生成します。 テクスチャファイルを読み込んで Direc D で扱えるようにするには , Direct3DX ライ プラリの読み込み関数である D3DXCreateT extureFromFileA ( ) などを用いると簡単に 操作することができて便利です。テクスチ ャステージへの代入および設定は , デバイ スのレンダリングステートからコントロー ルすることになります。 5. lDirect3DVertexBuffer8 頂点バッフアを扱う場合に使うインタフ ェイスです。バッフアの確保場所はシステ ムメモリでもローカルメモリ ( ビデオポー ド側 ) に置いてもかまいません。 また , 普通はこれを Direct3D 側が自動で 管理するようになっていますが , 自分でマ ニュアル設定することも可能です。これに ついては後述します。 意味 Flag D3DUSAGE_SOFTWAREPROCESSlNG D3DUSAGE_POlNTS D3DUSAGE_DYNAM ℃ その領域がクリップされないことを宣言する。アプリケー ション側で内容を管理する必要があるが , Di 「 ect3D の仕事 を軽減することになる 確保するデータが動的であることを宣言する。概して静的 なバッフアはビデオメモリに置かれ , 動的なバッフアは AGP メモリに置かれることが多い 高次プリミティブ用にバッフアを使う N バッチによる描画を指定 ポイントスプライト , あるいはインテックスでのポイント リスト描画 バッファ管理がソフトで処理される アプリケーションからのバッフアへのアクセスがライトオ ンリーであることを明示する。この場合 , アプリケーショ ン側から読み込みを行うと性能がかなり悪化するが , ドラ イバにとって最適な場所に領域を割り当てることが可能に なるので , 読み込みがほとんど発生しない場合の性能向上 に貞献する 特集 2 Dire tX8 徹底解説 6. lDirect3DSurface8 テクスチャが親子関係を持っている場合 ( キューブマップや MIP マップなど ) にその 子情報を扱うのに使用できます。また , 同 様にフリップチェインでマルチフレームバ ッフアを採用する場合にバックバッファ群 を形成するのに使われます。トリプルバッ ファ以上のチェインを形成したり , 自分で MIP マップテクスチャを管理したりするの ではない限り , 個別に作成して操作するこ とはあまりないと思われます。 リソースの管理 リソースはすでに述べたとおり , 頂点ノヾ ッフアやテクスチャなどのメモリ上に確保 されるデータの総称です。リソースは次の 4 つのプロバティを持っています。 Usage リソースの使われ方を表し , TabIe3 に示 す 7 つのフラグがあります。これらは同時 に複数設定することができます。 Format リソースのデータフォーマットを表しま す。そのフォーマットはリソースの種類に よって決められた中から選択することにな ります。全部のフォーマットは書ききれな いので , D ⅳ ec Ⅸ 8SDK のドキュメントやヘ ッダを参照してください。テクスチャのピ クセルフォーマット ( A8R8G8B8 など ) とい ったものががこれに当たります。 P06 リソースを確保するメモリの領域につい て表します。また , その管理方法について も規定します ( 後述 ) 。 Type リソースのタイプを表します。全部で 7 種類です ( TabIe4 ) 。その中のいくつかは継 特集 2 Directx 8 の徹底解説 41

5. 月刊 C MAGAZINE 2001年2月号

スにはロックをかけることができないので , リソースを更新したい場合には専用のメソ ッドである IDirect3DDevice8::CopyRect ( ) や IDirect3DDevice8::UpdateTexture ( ) など を用いることになります。ただしドライバ に特化した特殊なフォーマットのテクスチ ヤではロックすることが可能です。また , テクスチャ以外の頂点バッフアなどのリソ ースでは初めからロックして書き込みを行 うことが可能です。 既述の 2 タイプと違ってデバイスロスト 時には必ずリソースを解放してからデバイ スリセットを行わなければなりません。 描画の流れ 3D オプジェクトの描画をどのようにプロ グラムするのか , Direc Ⅸ 8 でのやり方をソ Fig. 5 サンプルプログラムの処理の流れ Direct3DC 「 eate8( ) : C 「 eateDevice( ) : C 「 eateTexture( ) : C reateVe 「 tex B u ffe 「 ( ) : CreatelndexBuffer( ) : 初 期 敢 RenderState の初期化 変換行列の設定 ビューボートの設定 光源 , マテリアルの設定 ースと照らし合わせて解説します。 新機能の話は置いておいて , まず単純に シンプルなオプジェクトを描画するルーチ ンの書き方について説明していきます。 こではテクスチャ付きの立方体オプジェク トを画面上に出すだけのサンプルプログラ ムを使って , DirectX Graphics プログラミ ングの骨格を浮き彫りにしていくことを目 的とします。 サンプルデモ 初めのサンプルは 256X256 のビットマッ プ画像をテクスチャとして貼り付けた立方 体が , 3D 空間上をふわふわと回転しながら 動いているというだけのシンプルなもので す ( 全体のソースコードは付録 CD-ROM に収 録。なおサンプルプログラムのビルド環境 では , 「 dxguid. lib 」 , 「 d3d8. ⅱ b 」 , 「 d3dx8. ⅱ Present( ) : EndScene( ) : D 「 awP 「 imitive( ) : Clear( ) : BeginScene( ) : 変換行列の更新 メッセージループ 後処理旧 e ase ( ) : ) 特集 2 Dire tX8 徹底解説 b 」の 3 つのライプラリを適宜追加しておく 必要がある ) 。光源は 1 つの並行光で , 立方 体なのでフラットシェーディングを用いて います。ここでは頂点バッフアとインデッ クスパッフアを使用してみました。 全体のフロー図を Fig. 5 に示します。 Win Main や WinProc に関してはここでは省略し ています。 Direc Ⅸに関連する部分に限る と , プログラムは大きく初期化部 , レンダ リング部 , 終了処理部の 3 つに分けること ができます。初期化部は始めに一度だけ呼 び出されますが , レンダリング部は , W1nd ows のメッセージループの中で何度も繰り 返し呼び出される部分です。プログラムの 終了は [ ] キーか , ウインドウモードの 場合には右上端のボタンの押下で検 出しますが , このときにオプジェクトの解 放を行うのが終了処理部分です。たいてい の 3D 描画アプリケーションではこの骨格の 上に随時必要な処理を組み込んでいく形に なると思います。 それではもう少し詳しく見ていくことに しましよう。 初期化部分 始めに述べたように , DirectX8 における 初期化は非常に簡略化されました。 Fig. 5 にあるように , 始めに Direct3D オプジェク トを生成したら , デバイスを作成するのに ほんの 24 行ほどの処理だけで済ませられま す (List 2- (a) ) 。 デバイスを作成する作業のほとんどは , 作成メソッドのパラメータの 1 つである D3D PRESENT_PARAMETERS 構造体を埋める ことであるといっても過言ではありません (TabIe5)0 この構造体はフレームノヾッファ のサイズの指定からステンシルノヾッファ , デブスノヾッフアの設定 , フルスクリーンモ ードの指定についてなど , 画面の表示関連 についての初期化を管理しています。これ らのパラメータの中に 1 つでも無効なもの がある場合には , IDirect3D8::CreateDevice ( ) 関数は成功しません。とくに注意すべき 特集 2 Directx 8 の徹底解説 43

6. 月刊 C MAGAZINE 2001年2月号

えませんが , 手軽にパッチモデルの描画を 実現することができるのは大きな進化とい えるでしよう。 ボリュームテクスチャのサポート 3D テクスチャをサポートするようになり ました。ポリュームライトマップや , テク スチャによるマテリアル表現などが実現可 能になります。 プログラマプルシェーダ これが今回のバージョンアップに見る最 大の売りであるといえるでしよう。今まで の Direct3D ではプリミテイプ単位での固定 シェーディングしか行えませんでしたが 今回から頂点単位でジオメトリ演算が可能 になる頂点シェーダ , そしてピクセル単位 でそのカラーやテクスチャ操作が可能にな るピクセルシェーダが利用可能になりまし 実際にはプログラマプルシェーダを使う か , 今までの固定シェーダを使うかは , プ ログラマの選択に任されています。プログ ラマプルシェーダを使って今までと同様の ジオメトリ演算 , ライティングなとを行う 場合 , そのシンプルさとハードウェア実装 による圧倒的な高速化が可能となるでしょ Direct3DX の充実 コンポーネント自体が非常にすっきりし た DirectX8 ですが , さらにプログラムの効 率化を目指してラッパー関数の充実が図ら れています。 Direct3D の利用を手助けする Direct3DX ユーティリテイライプラリが大 きく拡張されたのも , その 1 つです。 DirectX G 「 aphics が利用できないケース いくら DirectX Gr 叩 hics が時代を反映し て高機能化されたといっても , すべてのこ とができるわけではありません。問題なの は , 初期のグラフィック環境である 256 色 パレットモードで動作する 2D アプリケーシ 34 C MAGAZINE 2001 2 ョンです。これまで Direc D では , シェー ディングなどに多くの色を使うため , 256 色パレットモードはサポートされていませ んでした。しかし DirectDraw では , 低速な 環境でも動作し , パレットアニメーション のような特殊効果も実現できる 256 色モー ドを使ったアプリケーションが多く作成さ れてきました。 結論からいうと , パレットを使用するア プリケーションは , DirectXGraphics を使 って作成することはできません。 DirectX8 SDK に付属するサンプルプログラム「】 ima tePaIe e 」を見てもわかるとおり , これらの ようなアプリケーションは従来の DirectDra w7 インタフェイスを使用して作成されてい ます。 前述のように今回の Direc Ⅸ 8 にバージョ ンアップしたからといって , 以前の DirectX 7 が使えなくなるわけではありません。 コラム れまで洗練されてきた 2D 描画における Dire ctDraw コンポーネントは DirectX 8 で姿を消 しましたが , DirectDraw7 インタフェイス を完成された 2D グラフィックコンポーネン トとして使用すればいいのです ( コラム参 照 ) 。 VisuaIBasic での利用 DirectX Graphics では V1suaI Basic を完全 にサポートしています。 DirectX8SDK 付属 のサンプルプログラム「 Bi Ⅱ board 」を見ても , まったく同じプログラムを C / C + + でもⅥ sual Basic でも作成できることがわかります ( Fig. インタフェイスなども同じです。 DirectX 7 ではデバイスやピクセルフォーマットを列 挙するためのオプジェクトが VisualBasic の みに提供されていましたが , DirectX 8 で Dir ectDraw と Direct3D の構造が大幅に変更さ DirectX G 「 aphics の使い分けを考慮する 山崎由喜憲 with exilis (SurgeSpace) DirectX 8 SDK 付属のサンプルでさえ , 前 バージョンである DirectDraw7 インタフェ イスを使用していることから , これまでの DirectDraw, Direct3D と新しい DirectX Gr 叩 hics をどのように使い分けるかをはっき りさせておいたほうがよさそうです。 筆者の基本方針としては , DirectX Gr 叩 hics でできないことは古いバージョンで行 い , それ以外については , やりたいことが 簡単にできるかどうかという基準で適切な バージョンを使用します。 ま $DirectDraw7 を使わざるをえないア プリケーションです。これは本文で述べた とおり , 256 色パレットモードを使用した アプリケーションです。 次に DirectDraw7 を使用したほうが簡単 に作成できるアプリケーションです。慣れ の問題もありますが , 単純なスプライトア ニメーションしか使用しないアプリケーシ ョンや , メガデモのようなバリバリとピク セルを直にいじってエフェクトをかけるア プリケーションがこれに当たります。 3D ア クセラレーションの機能をいっさい使用し ないのに 3D 系統まで初期化する必要はまっ たくないからです。 こまで述べた中に該当しないアプリケ ーションは , DirectX Graphics を使用すれ ばよいでしよう。 3D アプリケーションや , 先に紹介した 3D アクセラレーション機能を 活用した 2D アプリケーションなどです。つ まり旧バージョンを使うのは , 削減された DirectDraw 周りの機能が必要なときのみ で , 「 Direct3D については DirectX Graphics ですべてのことができるので古いバージョ ンを使用する必要はない」ということにな ります。 DirectX Graphics の登場により , 3D アプ リケーションのプログラミングがとつつき やすいものとなりました。過去 , Direct3D の初期化に挫折して 3D プログラミングを断 念された方も , これを機にもう一度チャレ ンジされてはいかがでしようか

7. 月刊 C MAGAZINE 2001年2月号

特集 2 Dire tX8 こではそれらを解説しておきま 徹底解説 ク転送用 API はなく , 関連するパレット系 のインタフェイスもありません。サーフェ スのインタフェイス名も IDirect3DSurface8 になっています。つまり , DirectX Gr 叩 hics は完全に 3D アプリケーション用のコンポー ネントなのです。 では従来のような 2D アプリケーションで は , どのように DirectX Graphics を使えば よいのかという問題が出てきます。しかし 答えは簡単です。今まで 2D スプライトとし て表示していたビットマップは , テクスチ ャ + ポリゴンとして描画すればよいのです。 ハードウェアに座標変換機能が搭載される など , 状況は変化してきましたが , 基本的 なところを考えると 3D アプリケーションと いっても最終的な描画の段階においては結 局 2D に変換されたものを描画するのです。 そう考えると , ポリゴンで 2D のキャラクタ を描画するというのもそうおかしな話では ありません。むしろこれからはこのような 方向へと移っていくでしよう。 このように DirectX Graphics は 3D 専用の グラフィックコンポーネントと解釈しても いいかもしれません。 もちろん COM の利点により , 前バージョ ンの DirectDraw7 インタフェイスは残され ています。以前のままの描画方法もサポー トされています。 DirectX Graphics の利点 DirectX Graphics によってフログラマが まず最初に得られる利点は , 「初期化が容 易になる」ということです。 Fig. 1 をご覧に なればその違いは一目瞭然です。初期化の 煩わしさから解放されるとともに , 初期化 に伴うバグの発生を抑えることもできます。 DirectX 7 の時代には , この初期化作業を 簡略化するために Direct3DX Utility Library という c / C + + 用のライプラリが用意されて いました。これを使えば単純なコードで Dir ect3D の初期化を行い , その後のコードも 簡単に記述できるようにいくつかのインタ フェイスと数多くの関数が定義されていま した。しかし DirectX 8 の Direct3DX ではこ の初期化の部分は完全になくなっています。 DirectX Gr 叩 hics によって初期化に手間が かからなくなったので , 初期化に関係する インタフェイスは削除されたと考えられま す。 Direct3DX は初期化のためではなく , その後の描画処理 , 演算処理のヘルバー関 数という方向へ本腰を移した形でしよう。 Direct3D はつぎつぎと新しい機能が追加 され , とてつもなく大規模なものとなりま した。その全体像を把握するのは至難の業 であると同時に , それを使いこなすとなる ととてつもない労力が必要となります。少 しでも労力を軽減するために , もはや Direc t3DX はなくてはならないものでしよう。 DirectX Gr 叩 hics はドライバ開発者にも 朗報です。これまで H 用はその複雑さゆえ にバグの発生源でした。また こちらのポ ードでは動くがこちらのボードでは動かな いという問題も日常茶飯事でした。しかし DirectX Graphics として統合化されたため , ドライバの構成はシンプルに , バグの発生 しにくいものになるはずです。 先ほど , これからは 2D キャラクタはテク スチャ + ポリゴンで描画すると書きました が , 実はここには新たな可能性が秘められ ています。今日の 3D アクセラレータにはポ リゴン描画におけるさまざまな機能が搭載 されています。例をあげてみると , 各種プ レンディング , ポリゴン変形によるエフェ クト , Z バッフアによる Z クリッピング , ス テンシルバッフアによるマスキングなどが あります。さらには , 描画位置の指定にお いては整数単位ではなく浮動小数点単位で 指定するため , キャラクタや背景の滑らか なスクロールが可能です。これにより , 従 来の 2D アプリケーションの表現力を超えた 新しい 2D アプリケーションの開発が可能に なるわけです。 搭載された新機能 DirectX Gr 叩 hics では機能が統合された 以外にもいくつかの最新技術が搭載されて います。 しよう。 マルチサンプリング機能のサポート マルチサンプリング機能とは , レンダリ ング結果を複数回重ね合わせて 1 つのフレ ームを算出する手法です。画像の工ッジを ぽかすアンチェイリアシングや , モーショ ンプラーの実現に使われます。サンプリン グ結果からどのように最終出力を計算する かという実装の部分はハードウェアによっ てまちまちですが , 抽象化された DirectXG raphics なら共通の API による設定の変更だ けでサポートできます。 ポイントスプライト ポイントスプライトとは , いわゆるパー ティクル描画のことです。メガデモなどで は , 多数の点が文字になったり , 爆発シー ンなどで使われているよく知られた手法で す。 DirectX Gr 叩 hics では , 3D 空間 ( ワー ルド座標 ) あるいは画面上の座標を与える と , 設定しておいた大きさの矩形ポリゴン をその座標を中心にして描画します。霧や 火花の表現などに使われます。 インデックスパッフアのハードウェアサポート 以前のバージョンでもサポートされてい た IndexedPrimitive の描画におけるインデッ クスリストを , ビデオメモリ上に確保でき るようになりました ( もちろんシステム上に 確保することも可 ) 。よって静的なインデ ックスリストの場合 , 大幅に性能が改善さ れます。また , これに伴い , インデックス リストの管理機構に変更が加えられていま す。これらについては PA に 12 のサンプルプ ログラムの中で使っています。 バッチモデルの描画のサポート 高次プリミテイプや N パッチの描画がサ ポートされました。残念ながら現段階 ( 12 月 ) ではそのようなハードウェアがまだ一 般的でないため , 実用的な描画方法とはい 特集 2 Directx 8 の徹底解説 33

8. 月刊 C MAGAZINE 2001年2月号

特集 2 Dire tX 8 徹底解説 れたのに伴って , これらのオプジェクトは ただ 1 つ , 実装面で若干異なる部分があ 実装方法のほうが適切だと思うのですが , なくなっています。また DirectX 7 では Direc ります。 Direct3DX の部分です。 C / C + + モ なぜ C / C + + と Vrsual Basic でこのような実装 tDrawSurface7 オプジェクトに直線の描画や ジュールでは Direc DX に多くの関数が存 の違いが現れたのか ? その理由として筆 テキストの描画など , 標準のモジュールで 在するのに対し , VisualBasic 用のモジュー 者は「 C / C + + モジュールは DirectX 7 の仕様 はサポートされていない GDI のような機能 をそのまま引き継いだのに対し , VisualBas ルでは D3DX8 という C / C + + にはないオプジ が存在しましたが , それらもいっさいなく ェクトにまとめられています。 ic モジュールは初めての対応ということも なり , 標準モジュールと同じようにとても 今後のバージョンアップのことなどを考 あり , その段階での最善の実装を行った」 すっきりとした構造に仕上がっています。 えるとどちらかというと VisuaI Basic による ということではないかと考えています。 また , Direct3DX はこれまで Visual Basic Fig. 2 DirectX 8 SDK 付属のサンプルプログラム「 B Ⅲ boa 「 d 」 向けには提供されていませんでしたが , Dir ectX 8 においてⅥ sual Basic でもサポートさ (a) C / C + + で作られたサンプル れたことにより , C / C + + モジュールとⅥ sual Basic モジュールとの差は完全になくなりま した。これでやっと VisualBasic における Di rec Ⅸの開発環境が整ったということになり ます。 ロ回ロ お日Ⅲ bo 引・ d. 03 D B Ⅲ bo 引・ d ing Examp 、 69.19 fps ( イ 00XJ00X32 ) ()I 6 ) Eile DirectX AudiO DirectX の古いバージョンを振り返ってみ ると , 最初は DirectMusic というモジュール はありませんでした。 DirectSound のみが用 意されていましたが , それは遅れのない高 速なサウンドミキシングをサポートするた めにありました。そして , あとから追加さ れた DirectMusic では , Downloadable Soun d ( D ) が提供されました。これは MIDI フ ァイルで環境の音源によって音質が違うと いう現象が起こらないようにするためのも のです。すなわち , 音源が DownloadabIe な わけです。バージョンアップが重なるにつ れてつぎつぎと機能が付け加えられて , 再 生するサウンドにリバープ , 工コー ラスなどのエフェクトをかけたり , 立体音 響を作り出したりする機能がサポートされ ました。 DirectX 8 では , DirectXAudio という名前 になり , これら DirectSound と DirectMusic のコアを一体化する作業が行われました。 また , 新しい機能が提供されている一方 で , 従来どおり DirectSound , DirectMusic という役割分担したプログラミングに対し てのサポートも継続されています。ノウハ 特集 2 Directx 8 の徹底解説 35 (b)Visual Basic で作られたサンプル お日Ⅲ bo 引・ d : D3D Billboarding ExampIe

9. 月刊 C MAGAZINE 2001年2月号

データを高レベルでコントロール可能な API ゲームを作成するようにアナウンスしてい インストールされていなくてはなりません。 が DirectX の機能として提供されるというの DirectSetup はインストール先の環境にイン ます。 は興味深いところです。 ストールされている Direc Ⅸのバージョンを これまでのところ , 1 年ごとに新しい Dire 確認し , 適切にインストールする機能を提 昨年の MeItdown To 。 2000 で配布され ctX がリリースされていますが , このスケジ 供しています。すべてをインストールする たテキストに DirectShow の API で記述され ューリングは変わらないもようです。 た恐ろしいほどコンパクトな「 MP3 プレイ となると容量がかさむので , DirectDraw, 参考となるもの ヤ」のコード (List 1 ) があったので試しに打 Direct3D , DirectSound のようにコンポー ネントごとにインストールすることもでき ち込んでコンパイルしてみたところ , なん と本当に問題なく動作するものができあが るようになっています。 マイクロソフトの Direc Ⅸ開発者向けに公 ってしまいました。 開している Web サイト , VisuaIBasic での対応 DirectShow が提供する高レベルな API に ・ DirectX DeveIoper Center 対する需要というのは , 意外と大きいので DirectSetup は DirectX のほかのコンポー http://www.microsoft.com/japan/dev はないかと思います。 ネントと比べても比較的サイズが小さいも eloper/directx/ のであり , VisuaI Basic でもすべての機能が では , DirectX ファミリの最新ニュースだけ VisuaI Basic での対応 サポートされています。 ではなく , 効果的な実際の使い方など日本 DirectShow については , ドキュメントも 語のコンテンツが多く掲載されています。 ) 今後の DirectX C / C + + 用のものと統合されていることから 見てみるといろいろ参考になるところが多 もうかがえるようにまだ Visual Basic への いでしよう。 対応はほとんど行われておりません。あく 本誌 2000 年 11 月号の MONTHLY HEADL までサプセット版のみの提供です。サポー INE にも掲載されましたが , DirectX Graphi トされる機能は , フィルタグラフの基本的 cs などで予定されていた一部の機能は「 Dire な部分と DirectShow 編集サービス (DES) の ctX 8.1 」として 2001 年前半にリリースされ DirectX 8 のリリースにあたり注目すべき 一部 , それから PARI 、 3 で解説する MSWebD る予定となっています。その次のバージョ 点は , 多くの新機能の追加と同時にプログ VDActiveX コントロールのみです。 ンである「 DirectX 9.0 」では Windows 95 がサ ラマへの負荷を軽減するための配慮が各所 ポートされなくなります。これにより , Win でなされたことです。グラフィックス / オー DirectSetup dows 2000 系列のカーネルを持つ OS へとシ ディオの両コンポーネントを中心に DirectX フトしていくことになります。現在のとこ 全体で新しい機能を実現するための大幅な 変更が加えられているにもかかわらず , 基 DirectX を使用して作成されたアプリケー ろマイクロソフトでは , Windows2000 上で ションを実行するためには , 必ず実行環境 動作 / プログラム開発を行うように奨めて 本的な作業に関する部分については簡潔な に同等かそれ以上のノヾージョンの DirectX が いるほか , 次期 Windows の Whistler 向けに ものとなるように調整されています。 VisuaI Basic でのプログラミングや DirectShow の A st Di 「 ectShow を使った MP3 プレイヤの例 (Meltdown T0kY0 2000 の資料より ) PI など , 必要に応じて高レベルの機能を提 供するものも存在するようになったので , #include く streams. h>//C:%mssdk*samPles"ultimedia%DirectShowVBaseClasses / / 新しいへッダファイルは DS れ 0 響 . h / / #include く windows. h> 今までとは少し違った利用方法も生まれて / / このアプリケーションをビルドするには基底クラスライブラリのビルド / リンクが必要 / / void main(void) くるかもしれません。 IGraphBuilder * て ap 場 ただし , 新しいものに挑戦するときはい IMediaControI *pMediaContro 嵭 つでもそうとうなパワーを必要とするので CoInitia lize ( NULL CoCreateInstance(CLSID—FilterGraph, NULL, CLSCTX—INPRæ 素直に喜べない部分もあります。「うまく IID-IGraphBuiIder, (LPVOID *)&rßraph); Eßraph->QueryInterface(IID-IMediaContr01, (void (*)&pMediaControl 使えるようになってプログラミングが楽し pGraph->Renderpile(L"test. 叩3% LL ) だセ e 日 t. 叩 3 ″を任意のファイル名に置き換える pMediaControI->Run( くなるときが来るといいな」などと想像して MessageBox(NULL, ″ C は ck me セ 0 end p y ck. % "DirectShown, 期ー OK pMediaContr01->ReIease( みたりするとチャレンジする意欲が湧いて rßraph → Release( CoUninåtialize( くるかもしれません。がんばってみてくだ まとめ 1 38 C MAGAZINE 2001 2

10. 月刊 C MAGAZINE 2001年2月号

CIear ( ) の第 4 パラメータでは塗りつぶしの 色を直接指定しています ( List2- ( k ) ) 。 その後は今までの DirectX と同様 , DrawP rimitive() の呼び出しが続きます。始めのス トリップと , シングルトライアングルリス トを続けて描画しています。頂点数などの 指定は少しややこしいので注意してくださ い。このあたりを間違えるとおそらくアプ リケーションは即座に異常終了することで しよう。 終わればあとは EndScene ( ) を呼び出して レンダリング終了を告げます。 最後にデバイスが Present() メソッドをコ ールして , レンダリング結果を画面に描画 することになります。 Present の設定は初期 化の部分ですでに述べたとおりです。 終了処理 このデモの場合 , 終了イベントはキ ーか新ボタンを押すことで発生しますが , このときに後処理としてオプジェクトを解 放しておく必要があるのは以前までのバー ジョンと同じです。 COM モデルの特徴であ るリファレンスをクリアすべく , Release ( ) メソッドを呼び出しています (List 2- (I) ) 。 まとめ 本来なら Direc Ⅸ 8 の最大の売りであるプ ログラマプルシェーダの話に時間をかけた 特集 2 Dire tX8 徹底解説 かったのですが , そもそもハードウェアサ ポートをしているビデオポードが現時点で リリースされていなかったため , 今回は基 本的な話に重点を絞り , それらの特殊なフ ィーチャについては製品が出始めてからじ っくり取り上げることにしました。 2001 年 春までにはハードウェアでプログラマプル シェーダを実装したビデオポードが出るも のと予想されますし , マイクロソフトのゲ ーム端末である X - Box のグラフィックチッ プにもこの機能が搭載される予定になって います。この機能はグラフィックにおける 表現の自由度を飛躍的に広げるので , 誌面 に余裕が持てるときにじっくり解説してい きたいと思います 冊 3 VisuaIBasic から DirectX 8 を利用する 山崎由喜憲 with exilis(SurgeSpace) , イラスト : takechu (SurgeSpace) DirectX 8 のもう 1 つの大きな特徴とし てい VisuaI Basic への対応が広がった ことがあります。 VisuaI Basic には Dire ctX 7 から対応しましたが町 DirectX 8 ではさらに全コンホーネントで利用でき るようになりました。本章では , これら の利用について考察し , 利用例の 1 っと して DVD プレイヤを作成してみます。 はじめに DirectX 7 では Visual Basic への対応がな され , 簡単かつ高速にアプリケーションを 作成できるというⅥ sualBasic の利点を生か した Direc Ⅸプログラミングが可能になりま した。これによって「Ⅵ sual Basic は高速な アクションゲームを作るのには向かない」と いった定説は覆されましたが , いまいち盛 り上がりに欠けているようにも思えました。 VisuaIBasic からの利用方法 こでは DirectX 8 が Visual Basic からどん なことができるのか , その利用方法や概要 から始め , 前バージョンである Direc Ⅸ 7 と の比較も交え , いくつかのコンポーネント に限って解説してみます。 こから実際に Direc Ⅸ 8 を使ってプログ ラムを作るときの指針となれば幸いです。 DirectX Graphics DirectX Gr 叩 hics はすべての機能を Visual Basic から利用することができます。しかし 複雑な計算を要する 3D アプリケーションを 構築するとなると , 同じ処理でも C / C + + で フ回の Direc Ⅸ 8 の登場は , そういったこ れまでの「いまいち」となる部分を克服し , より快適で高度な Direc Ⅸによるプログラミ ングを行えるようになっています。 組んだほうが V1sual Basic で組むよりも高速 に動作することがあります。たとえば Direc Ⅸ 8 の SDK に付属するサンプルプログラム 「 vertexshader. exe 」では , C / C + + 版のほう が VisuaI Basic 版よりもスムーズに動作する ように筆者は感じました。 そこで Direc Ⅸ 8SDK のサンプルプログラ ムをいくつか見てみると VisualBasic から Di rec Ⅸ Gr 叩 hics をどのようなときに使えば よいか , マイクロソフトの提案を垣間見る ことができます。これらのサンプルアプリ ケーションは非常に単純ですが , パワフル にできています。たとえば , 「 clubmet. exe 」 のサンプルプログラムはコマーシャルデモ ですが , これを少し変更するだけでメニュ ーやランチャーを作成することができます。 既存のアプリケーションにこのようなテク ニックを駆使したアクセントを取り入れる ことにより , より魅力的なものへと仕上げ ることが可能なのです。 特集 2 Directx 8 の徹底解説 49