D3DX について

Philip Taylor
Microsoft Corporation

July 11, 2002

Driving DirectX へようこそ。本コラムでは、今月から D3DX を取り上げたいと思います。D3DX、つまり MicrosoftR Direct3DR ユーティリティ ライブラリには、多くの分野にわたる便利な機能が多数用意されています。D3DX にはメッシュ、エフェクトとエフェクト ファイル、数値演算サポート、テクスチャ サポートなど、開発者の時間を節約してくれるさまざまな機能があります。個々の開発者が、D3DX にすでに備わっている機能をゼロから開発しなおしてしまうというケースは少なくありません。おそらく、D3DX の機能についての詳しい解説がないため、または使用例のサンプルが不足しているために、その機能がすでに D3DX にあるということに気づかないでいるのだろうと思われます。本コラムの今後のシリーズでは、あらゆる人が D3DX を十分に活用できるように、D3DX の機能を紹介し、D3DX のいくつかの部分については詳しく解説していくことにします。

D3DX の歴史

D3DX はヘルパ サービスを提供するユーティリティ ライブラリで、Direct3D コンポーネントの上の層として位置付けられます。図 1 は D3DX の一般的なアーキテクチャを示しています。これは D3DX が生まれたときから今にいたるまで成り立っている概念図です。

図 1. D3DX アーキテクチャ

D3DX が初めて登場したのは MicrosoftR DirectXR 7.0 SDK のときのことで、現在のライブラリの前身であるテクスチャ サポートと数値演算サポートを含んでおり、その最も重要な目的は初期化サービスを提供することでした。

DirectX 8.0 SDK では、もっぱら DirectX 7 SDK の D3DX コンテキスト初期化サポートをベースにモデル化された、単純化した Direct3D 初期化機能が追加されました。DirectX 8.0 の時点で、このライブラリの目的は、初期化ヘルパ ライブラリというものから一連の有用な高度な機能へと変わりました。ここには、やはり大きく進化した既存の数値演算サポートとテクスチャ マッピング サポートをベースにしたメッシュ、シェーダ、エフェクトの新しいサービスが含まれました。

DirectX 8.1 SDK になって、D3DX は再び大きくアップグレードされ、特にメッシュ、テクスチャリ、数値演算サービスに大幅な改善が加えられました。では、DirectX 8 での D3DX について詳しく見てみることにしましょう。

D3DX は、インターフェイス、関数、マクロの 3 つの主要な分野と、構造体 (インターフェイス、関数、マクロが使用する) と、使用頻度の高い一部の構造体のための C++ オーバーロードと、D3DX 固有のエラー コードという 3 つの補助的な分野に分類できます。この記事では、直接または間接にこれらすべての分野についての情報を示し、D3DX のトピックに関する今後の記事のためのガイドを提供します。

各種のインターフェイスと関数の中で、D3DX は数値演算、テクスチャ、シェーダ操作などの基本的なニーズを広くサポートし、またエフェクト ファイルやメッシュなどの高度なサポートも提供しています。さらには、行列スタック、単純な形状、エラー処理などの汎用ユーティリティ サポートも用意しています。

D3DX の数値演算サポート

いくつかの関数のセットに含まれている数値演算サポートは、以下のように分類できます。

  • カラー計算 (関数 8 個)
  • 平面計算 (関数 8 個)
  • 行列の操作 (関数 31 個)
  • クォータニオン (関数 19 個)
  • 2-D ベクトル (関数 17 個)
  • 3-D ベクトル (関数 19 個)
  • 4-D ベクトル (関数 15 個)

C++ のオーバーロードと組み合わせた場合、基本的な 3-D 数値演算タイプのサポートはきわめて網羅的なものとなります。オーバーロードされているコンストラクタ、演算子、これらの型で使用できる型キャストについは、「C++ のオーバーロード」のセクションを参照してください。さらにボーナスとして、高度なライティングに使用できる D3DXFresnelTerm 関数があります。高度なライティングでのフレネル項の使用方法については、MSDN DirectX Web サイトの Meltdown スライドで簡単に触れています。

D3DX のテクスチャ サポート

IDirect3DTexture8、IDirect3DCubeTexture8、IDirect3DVolumeTexture8 は、標準ミップマップ テクスチャ、キューブ マップ、ボリューム テクスチャの基本的サポートを提供しており、D3DX はこれらのコア インターフェイスの上に構築されています。テクスチャリ サポートは、標準ミップマップ テクスチャ、キューブ マップ、ボリューム テクスチャに対して提供されています。これには、空のテクスチャの作成、テクスチャのロード、テクスチャの保存、フィルタリング、手続き的な生成、バンプ マッピングなどの基本的操作のためのヘルパが含まれます。

ファイル、メモリ、リソースからのテクスチャの作成とサーフェイスのロードにより、D3DX から Direct3D テクスチャを簡単に取得できます。テクスチャの保存機能は非常に便利であり、標準ミップマップ テクスチャとボリューム テクスチャでもサポートされています。標準テクスチャ、キューブ マップ、ボリューム テクスチャのためのミップマップ レベルのフィルタリングと、テクスチャが作成可能であるかどうかを判断するためのヘルパも用意されています。

D3DX は、一部の環境マッピング手法を直接にはサポートしていないハードウェアを簡単に扱えるように、環境マッピングのサポートを追加しています。手続き的なテクスチャ生成とバンプ マッピングのためのヘルパが用意されています。筆者は多くの文章でテクスチャ サポートの使い方に触れてきましたが、ほんの表面をなぞったに過ぎず、他にも多数の機能が存在します。

では、D3DX におけるテクスチャ サポートの全体像を見てみましょう。

  • テクスチャ要件チェック
  • 標準ミップマップ テクスチャ サポート
  • キューブ マップ サポート
  • ボリューム テクスチャ サポート
  • 環境マッピング サポート
  • バンプ マッピング サポート

D3DX のテクスチャ要件チェック

D3DXCheckTextureRequirementsD3DXCheckCubeTextureRequirementsD3DXCheckVolumeTextureRequirements により、特定のデバイス上で特定のテクスチャを作成できるかどうかを問い合わせることができます。これは、Direct3D8 の一般的な「プローブ」スタイルのプログラミング モデルを踏襲しています (以前の Direct3D は、列挙スタイルのプログラミング モデルを使用していました)。この機能は、IDirect3D8 インターフェイスが提供している CheckDeviceFormat サポートをベースにしています。

D3DX の標準ミップマップ テクスチャ サポート

標準ミップマップ テクスチャ サポートには、作成、ロード、フィルタリング、手続き的な生成、保存が含まれています。ファイル、メモリ、リソースからの作成とロードをすべてサポートしています。保存はファイルに対してしか行えません。D3DXFillTexture はユーザー提供のコールバック関数を使って、テクスチャ マップの個々のテクスチャ要素を生成します。D3DXFilterTexture メソッドが、標準ミップマップ、キューブ マップ、ボリューム テクスチャのための汎用関数になっていることに注意してください。これにより、キューブ マップ関数やボリューム テクスチャ フィルタ関数は廃止されています。

D3DX のキューブ マップ サポート

標準キューブ マップ テクスチャ サポートには、作成、ロード、フィルタリング、手続き的な生成、保存が含まれています。ファイル、メモリ、リソースからの作成とロードをすべてサポートしています。保存は実装されていません。D3DXFilterCubeTexture はユーザー提供のコールバック関数を使って、キューブ マップの個々のテクスチャ要素を生成します。上で述べたように、D3DXFillCubeTexture メソッドは廃止されていることに注意してください。

D3DX のボリューム テクスチャ サポート

標準ボリューム テクスチャ サポートには、作成、ロード、フィルタリング、手続き的な生成、および保存が含まれています。ファイル、メモリ、およびリソースからの作成とロードはすべてサポートされています。保存はファイルに対してしか行えません。D3DXFillVolumeTexture はユーザー提供のコールバック関数を使って、ボリューム マップの個々のテクスチャ要素を生成します。上で述べたように、D3DXFilterVolumeTexture メソッドは廃止されていることに注意してください。

D3DX の環境マッピング サポート

D3DX は、ID3DXRenderToEnvmap インターフェイスによるレンダー ターゲット サポートを通して、環境マッピングの特殊なサポートを提供しています。キューブ、ハーフ スフィア、半球、パラボラ、球の複合的な環境マップ サポートがすべて提供されています。

このレンダ ターゲット インターフェイスの一般的な使用パターンでは、Begin メソッドを呼び出し、レンダリングを行った後に、End メソッドを呼び出します。また、このインターフェイスは、デバイスの喪失とリセットの際の内部リソース管理のサポートも提供しています。この機能は、各種の環境マッピング方式を、それをサポートしていないハードウェア上でエミュレートする目的に用意されているものです。たとえば、これを使用すると、NVIDIAR TNT2 チップセット上で、ハードウェア アクセラレーションしたキューブ マップのレンダリングを行うことができます。また、1 つの環境マップ データを別の環境マップ データに変換することもできます (たとえば、キューブ マップとスフィア マップの間)。これは、キューブ マッピングの使用を検討したが、ハードウェア サポートが不足しているために採用を断念してきた開発者にとっては非常に有用です。

D3DX のバンプ マッピング サポート

D3DX は、高さマップを法線マップに変換するための D3DXComputeNormalMap メソッドを用意しています。これにより、x、y、z データを r、g、b データに変換するのが簡単になります。これは以下のフラグによって制御されます。

  • D3DX_NORMALMAP_MIRROR_U
  • D3DX_NORMALMAP_MIRROR_V
  • D3DX_NORMALMAP_MIRROR
  • D3DX_NORMALMAP_INVERTSIGN
  • D3DX_NORMALMAP_COMPUTE_OCCLUSION

これらのフラグはいずれも簡単に理解できるでしょう。最後の D3DX_NORMALMAP_COMPUTE_OCCLUSION フラグは、アルファ チャネルにエンコードするピクセル単位の遮蔽項の計算を可能にします。

D3DXComputeTangent メソッドは、テクスチャ座標の変化に基づいて、メッシュのローカルな接空間座標系を扱うので、メッシュ ルーチンにグループ化されています (接空間ライティングについては、「ピクセル単位のライティング」の記事を参照してください)。ただし、このメソッドは、正しいエンボスまたは EMBM スタイルのバンプ マッピング演算に必要な接空間ライティング計算もサポートしています。

D3DX のシェーダ サポート

シェーダ サポートについては、これまでの筆者の文章でも詳しく扱ってきました。D3DX は、その出力を D3DDevice8::CreateVertexShaderD3DDevice::CreatePixelShader で使用できるランタイム シェーダ アセンブラを提供しています。このアセンブラには、D3DXAssembleShaderD3DAssembleShaderFromFileD3DXAssembleShaderFromResource メソッドを通してアクセスします。D3DX シェーダ サポートの使い方については、筆者の頂点シェーダピクセル シェーダについての入門記事で説明しています。

D3DX のエフェクト サポート

ID3DXEffect インターフェイスとエフェクト ファイル (通常は .fx) により、オブジェクトに任意のビジュアルな外見を与えることができる柔軟性を備えた、スケーラブルなレンダリング システムの実装が可能となります。エフェクトは一連のテクニックによって定義でき、テクニックは 1 つまたは複数のパスを取ることができます。個々のパスは、エフェクトの一部または全体を処理します。

エフェクト ファイルは、定数とパラメータ、レンダリング ステート、テクスチャ ステージ ステート、ライト ステート、マテリアル ステート、シェーダ関連のステート、およびトランスフォーム関連のステートを含むことができます。これにより、適切な処理を加えれば、1 つのエフェクト ファイルにさまざまなテクニックを含めておき、特定のエフェクトを幅広いハードウェア上でレンダリングできるようになります。

SDK の Water サンプルは、エフェクト ファイルのこの使い方の例として優れています。エフェクト ファイルのもう 1 つの用途は、プロトタイピング環境です。MSDN Shader Workshop アプリケーションがそのショーケースとなっています。MSDN Shader Workshop アプリケーションを参照してください。

D3DX のメッシュ サポート

D3DX は、x ファイルの内容のロード、操作、レンダリングを行うためのメッシュ コンストラクトを実装しています。メッシュとは、基本的には、何らかのジオメトリを定義している頂点の集合と、面を定義しているインデックスのセットです。D3DX のメッシュにはいくつかの種類があります。

ID3DXBaseMesh は基本的な機能を提供しています。ID3DXMesh と ID3DXPMesh は ID3DXBaseMesh を継承しており、それぞれチップ単位の頂点キャッシュを使用したメッシュ最適化と、Hughes Hoppes のプログレッシブ メッシュの研究に基づくプログレッシブ メッシュを追加しています。ID3DXSPMesh は単純化メッシュを、ID3DXSkinMesh はスキン メッシュ サポートを提供します。

この階層は次のようになっています。

ベース メッシュID3DXBaseMesh

最適化メッシュID3DXBaseMesh → ID3DXMesh

プログレッシブ メッシュID3DXBaseMesh → ID3DXPMesh

単純化メッシュID3DXSPMesh
Created from ID3DXMesh

スキン メッシュID3DXSkinMesh
ID3DXMesh から作成

ID3DXBaseMesh は、ベース メッシュを継承する ID3DXMesh メッシュと ID3DXPMesh プログレッシブ メッシュ オブジェクトの操作とクエリのためのメソッドを提供しています。これには以下のものが含まれます。

  • 隣接操作
  • ジオメトリ バッファの取得とロック/アンロック操作 (頂点とインデックス)
  • コピー
  • レンダリング
  • 面情報
  • 一般情報
  • 頂点情報

最適化メッシュは、ベース メッシュの機能をベースに、新しいメッシュを作成する Optimize と、元のメッシュを変更する OptimizeInPlace の 2 つのメソッドによって、頂点キャッシュ最適化機能を追加しています。筆者のシェーダ最適化に関する文章では、メッシュ最適化の使用方法を解説しました。

プログレッシブ メッシュは、Hughes Hoppes の SIGGRAPH の論文をベースに、エラー メトリックスをアップデートしたものをサポートしています。ID3DXPMesh インターフェイスは、以下の操作のためのメソッドを追加しています。

  • コピー
  • 面の操作
  • 頂点の操作
  • 最適化
  • 保存などのその他のタスク

D3DXGeneratePMesh は D3DX の単純化アルゴリズムを使って、入力メッシュからプログレッシブ メッシュを生成します。D3DXSimplifyMesh は、同じ単純化アルゴリズムを使って、入力メッシュから指定された LOD の標準メッシュを生成します。ユーザーは、頂点コンポーネントごとに指定した重みと、頂点ごとに指定した重みを通して、使用するエラー メトリックを制御できます。コンポーネントごとの重みには、エッジの折りたたみごとに計算したエラーのそのコンポーネント部分の値を掛けます。頂点ごとの重みには、頂点を削除するかどうかを判断するために使うエラー メトリック値を掛けます。たとえば、頂点を決して削除したくない場合には、特定の頂点の重みを大きな値に設定してください。その逆に、早めに削除したい場合には、小さい値 (1 未満) に設定します。

スキン メッシュに関する D3DX の用語には、以下のものがあります。

  • スキン。三角形メッシュはデフォメーションを使ってレンダリングされます。通常、これはキャラクターの適当なポーズのモデルです。
  • ボーン。スキンの 1 つまたは複数の頂点に影響を与える変換行列。
  • スケルトン。スキン メッシュに影響を与えるすべてのボーンの階層。
  • ポーズ。特定のスキン メッシュに影響を与えるすべてのボーンのための完全に定義するボーン トランスフォームの集合。
  • 初期ポーズ。メッシュがスケルトンに関連付けられたときのポーズ。スケルトンがこのポーズになっている場合、デフォームされたメッシュは、元のデフォームされていないメッシュと同一のものになります。
  • ボーン空間トランスフォーム。このトランスフォームは、メッシュを特定のボーンのローカル空間に変換します。
  • ボーンの重み。ボーンが特定の頂点に対して持つ影響の量。重み 1 は、頂点がそのボーンのみの影響を受けることを意味し、0 はボーンの影響を受けないことを意味します。1 つの頂点に影響を与えるすべてのボーンの重みの総和は 1 になります。

これらの定義をもとに、スキンを適用したキャラクターは、メッシュの集合と、メッシュの頂点に影響を与えるボーンの集合によって定義されると言えます。ボーンはトランスフォームの階層として表現されます。個々のメッシュについて、メッシュをボーンのローカル座標系に変換する、そのメッシュに影響を与える個々のボーンのための行列が存在します。この行列は、メッシュのためのボーンのボーン空間トランスフォームです。これは、作成プロセスの過程で、スケルトンがメッシュに関連付けられる時点で定義されます。

筆者の 2 回目の MSDN シェーダ ワークショップの記事では、D3DX のスキン サポートを使用し、いくつかの重要なメソッドについて簡単に説明しています。今後の D3DX の記事では、メッシュとスキンについてさらに詳しく解説していく予定です。

D3DX のユーティリティ サポート

ユーティリティの分野は以下のように分類できます。

  • 行列スタック
  • プリミティブの生成
  • スプライト
  • フォント
  • レンダー ターゲット

以下に、それぞれについて説明します。

D3DX の行列スタック サポート

オブジェクトの複雑な階層を扱うときには、入れ子になった変換を処理するのに行列スタックが便利なテクニックとして使えます。スタックは、スタックへの行列エントリの追加と削除を行うプッシュおよびポップ操作を提供しています。現在の変換は、スタック上のすべての行列の連結として行われます。D3DX は、この基本的なレベルの機能を提供する ID3DXMatrixStack 行列スタック インターフェイスを用意しており、スタックに追加される行列を生成するプロセスを簡略化する行列変換サポートを追加しています。さらにボーナスとして、現在の行列を変更するためのオイラー角度の使用も明示的にサポートしています。

D3DX のプリミティブ描画サポート

単純なプリミティブの描画は、特にプロトタイピング サポートにはきわめて便利なことがあります。D3DX は、以下のものについての単純なプリミティブ生成機能を提供しています。

  • ボックス (一般化されたキューブ)
  • 円筒
  • トーラス
  • ティーポット
  • テキスト
  • ポリゴン

プリミティブは ID3DXMesh インターフェイスとして返されるので、D3DX のメッシュ サポートを理解しておくとそれだけ有効です。

D3DX のスプライト サポート

D3DX のスプライトは、3-D スプライトを実装するタスクを単純化します。スプライトはパーティクル システムとビルボードに有用であり、2-D の 3-D でのシミュレートに使用できます。ID3DXSprite インターフェイスにより、トランスフォーム付きまたはなしでテクスチャリングされたスプライトを簡単に描画できます。デバイスの喪失とリセットのサポートも含まれています。これらのスプライトは、コアのランタイムのポイント スプライト サポートをベースにしています。ポイント スプライトは、ポイントと可変サイズの両方で定義されます。このサイズは頂点ごとに設定することも、D3DRS_POINTSIZE レンダー ステートによって制御することもできます。レンダリングのためのテクスチャ座標は、D3DRES_POINTSPRITEENABLE レンダー ステートによって制御されます。

D3DX のフォント サポート

ID3DXFont インターフェイスにより、GD 論理フォントを 3-D でレンダリングすることができます。これは、斜体やカーニングなどがサポートされるが、パフォーマンスが犠牲になるということです。より高速なフォント実装が必要な場合は、SDK サンプル フレームワークで提供されている CD3DFont サポートを検討してください。

D3DX のレンダー ターゲット サポート

D3DXは、ID3DXRenderToSurface インターフェイスによって、レンダー ターゲットをサポートしています。このレンダー ターゲット インターフェイスの一般的な使用パターンは、環境マッピングのインターフェイスと同じように、Begin メソッドを呼び出し、レンダリングを行い、End メソッドを呼び出すというものです。また、このインターフェイスは、デバイスの喪失とリセットの際の内部リソース管理のサポートも提供しています。ID3DXRenderToSurface インターフェイスは、テクスチャをレンダリングするための一貫性のある抽象化を提供しており、ネイティブなサポートがないカードでもレンダリングを行うことができます。これは、ID3DXRenderToEnvmap が環境マッピングに関して提供しているサポートと似ています。ハードウェア サポートに一貫性がないという理由からレンダ ターゲットを避けてきた開発者には、このインターフェイスを検討することを強くお勧めします。

C++ 固有の機能

D3DX は、以下の型に対する (コンストラクタ、演算子、型キャストのための) オーバーロードのセットを用意しています。

  • D3DXCOLOR
  • D3DXMATRIX
  • D3DXPLANE
  • D3DXQUATERNION
  • D3DXVECTOR2
  • D3DXVECTOR3
  • D3DXVECTOR4

個々の型についてサポートされているコンストラクタに加えて、以下の演算子がサポートされています。

  • 代入 (+=, *=, -=, /=)
  • 単項 (+,-)
  • 二項 (*, +, -, /)
  • 論理 (==, !=)

個々の型について、便利なキャストが用意されています。また D3DX は、手続き的なテクスチャ生成をサポートするために、LPD3DXFILL2D および LPD3DXFILL3D 関数のための関数ポインタ定義を提供しています。

これらの型を使用する C++ プログラマにとっては、これは便利なボーナスであり、式の中でこれらの型を自然な読みやすい形で使用できるようになります。

その他の機能

また、D3DX は「その他」に分類されるいくつかの機能を提供しています。これには以下のものが含まれます。

  • テキストの 3D での描画。
  • レンダー ターゲットと環境マッピングのサポート。
  • スプライト作成サポート。
  • FVF サイズのサポート。

D3DXCreateFontD3DXCreateFontIndirect は、3-D テキストのレンダリングに使用される ID3DXFont オブジェクトを返します。これには GDI 論理フォントのサポートが含まれますが、パフォーマンス上のコストがかかります。サンプル フレームワークは、より高速な 3-D テキスト描画クラスを提供していますが、ID3Xfont のような優れたフォント サポートはありません。D3DXCreateRenderToSurfaceD3DXCreateRenderToEnvMap は、それぞれ ID3DXRenderToSurface および ID3DxrenderToEnvmap インターフェイスを返します。レンダ ターゲット サポートと環境マップ サポートの詳細については、これまでの解説を参照してください。

D3DXCreateSprite は、D3DX バージョンのスプライト サポートである ID3DXSprite インターフェイスを返します。D3DXGetFVFSize は FVF 形式のデコードを支援します。D3DXCreateBuffer は、シェーダのコンパイルと、ロードや最適化などのメッシュ操作を行うときに便利な ID3DXBuffer インターフェイスを返します。D3DX のエラー文字列メソッドである D3DXGetErrorString は廃止され、D3DX だけでなく、すべての DirectX 8 メソッドで使用できる DXGetErrorString8 メソッドに置き換えられています。角度を度単位とラジアン単位の間で簡単に変換できるようにする 2 つのマクロ、D3DXToDegreeD3DXToRadian が用意されています。また、メッシュの D3DX 固有の戻り値にも注目してください。

  • D3DXERR_CANNOTATTRSORT
  • D3DXERR_CANNOTMODIFYINDEXBUFFER
  • D3DXERR_INVALIDMESH
  • D3DXERR_SKINNINGNOTSUPPORTED
  • D3DXERR_TOOMANYINFLUENCES
  • D3DXERR_INVALIDDATA

D3DX に関する既出の記事

これまでの解説でおわかりのように、D3DX はかなり多くの機能を提供しています。筆者のコラムの多くでは、D3DX が提供する数値演算およびテクスチャ サポートを使用してきました。記事に付属のソースを grep で検索して、どのメソッドを使っているかを確認してみるといいでしょう。シェーダ シリーズでは、D3DX のシェーダ アセンブラとバッファ サポートを多用していました。MSDN Shader Workshop のシリーズでは、エフェクト ファイルとメッシュも使用しました。MSDN Shader Workshop の第 1 回の記事のソースでのエフェクトの扱いはかなり細かいものでしたが、MSDN Shader Workshop の第 2 回の記事でのメッシュの扱いはスキニング サポートのみを対象にしており、今後のコラムの題材となるような未踏破の領域が多く残されています。

D3DX の最後に

このコラムの執筆に際して、Craig PeeperAnuj GosaliaMike Burrows (Microsoft) の各氏のご協力に感謝します。モデルを提供していただいた Viewpoint Datalabs と Lightwave に感謝します。

ご意見をお寄せください。感想、質問、トピックに関するアイデア、コラムのトピックに関しての皆さんのやり方を示すリンクなどを(日本語で)directxj@microsoft.com まで送ってください。ただし、個別に返答したり、サポートに関する質問に回答したりすることはできませんので、あらかじめご了承ください。

Microsoft では、同じ目的の開発者が情報を共有できるようなフォーラムとして、活発なメーリング リストを運営しています(英語)。

Driving DirectX

Philip Taylor は DirectX SDK、Managed DirectX、Windows XP 3D スクリーンセーバーなどのプログラム マネージャです。 DirectX 3.0 から DirectX 8.0 までの DirectX エバンジェリズム グループのシニア エンジニアとして活躍し、多数のゲーム開発会社に対して DirectX 関連のサポートを行いました。GameSDK (DirectX 1.0) の最初のパブリック ベータの段階から手を染め、かつては実際に DirectX 2 でゲームを開発したこともありました。 時間に余裕があるときは、さまざまな 3-D グラフィックス プログラミング メーリング リストで彼に出会うことがあるかもしれません。

Driving DirectX コラム アーカイブ