しいしせねっとわーく

開発言語・技術資料室DirectXメモ

Last update 

DirectXは、Windows95とかNTで、やっとゲームができる程度の画像処理、音声処理ができるようになる技術である。
あまり使いやすくないから、止めといたほうがいいぞ、では話が続かないので、嫌ながら、使い方の解説をしてみる。
ちなみに、MFCを基本としてVisual C++ 5.0で開発している感じなので、どうだか。
Win32 APIを直接叩いても、よいぞ。ちみに、DirectX専門集団のように見える Bio100%の書籍も、MFC使えない上に、Win32APIの使い方が多少妙なようで。
ちなみに、DirectXの実装はグラフィックドライバで行うので、互換性はもっとも酷いともいえる。
う~ん、こんなのでG-Penが移植できるのかどうか。

DirectDraw

DirectXの画像処理APIである。処理系依存の詳細なところが取得できるので、画面への直アクセスも可能なようである。
MFCまたは、WindowsAPIやMFCを使ってWindow描画ができることが、DirectDrawを使うための基本知識である。それの応用で、DirectDrawも使うことになる。
だから、できるだけ使いたくない。

何ができる?

原理

 DirectDrawは、サーフェイス(画面)の転送しか、サポートしてくれない。スプライトは表現できるが、それ以上のものは無理なのである。

DirectDrawは、表示されている画面と、裏側に何枚かの画面があり、その間で画像データの転送を行うだけといってもいい部分を実行し、TOWNSなどのスプライトのような機能を実現できる。(スプライトとして使うには、TOWNSのハードウェアで処理する一部をソフトウェアで書いてやらなければならないのだが。)

DirectDrawには、Window内で表示する機能と、フル画面表示する機能がある。
普通は、次のような3種類のSurfaceを用意する事になる。DirectDrawでは、どういう方式をとらなければならないかは決められていないので、他の形式をとってもかまわない。

PrimarySurface 標示画面(VRAM)である。

BackSurface 書き込む画面。TOWNSではスプライト画面の非表示面に相当する。

PatternSurface 表示用のパターンを格納する領域。

とりあえずこの3つの画面というか、領域がある(BackとPatternは自分で作る)。PrimarySurfaceとBackSurfaceは、TOWNSのスプライト画面ではハードウェアで処理されていたスプライトの2枚のページと同じようなものである。ハード的に切替が効く。
フル画面の場合はこれでよい、Windowモードも同じようにできるとよいのだが、面倒なことにWindowモードとフル画面モードで、この処理方法は異なってしまう。
Windowモードの場合は、画面の一部だけハード的に切り換えるなんて事は不可能なので、Backに完成画像イメージを作って、そこからPrimaryに転送するという処理が必要である。

プログラム

MFC + DirectX7の場合

Windowsの基本はWndProcとか、Windowそのへんのメッセージ交換、ややこし過ぎるので却下。
MFCを使うとややこしい面々が隠れるので、利用してみる。

VC++ 6.0で新規プロジェクトを作成する。
ドキュメントビューは、サポートしない、その他各種オプションも不要なので削った初期設定でよい。

App、Frame、View、Aboutの4つのクラスを持ったプロジェクトが出来上がる。
このなかで、DirectXではViewとAboutも不要なので削ってしまう。
うまくコンパイルが通るようになったら、次に進む。

DirectX7 ヘッダとライブラリの追加。

MainFrm.hの先頭に、DirectX系ヘッダファイル #include <ddraw.h>を追加。
「プロジェクト」→「設定」→「リンク」に、ddraw.lib dxguid.libを追加。
ライブラリとヘッダファイルは、DirectX7a SDKからあらかじめコピーしておく。

ワークスペースのClassViewのCMainFrameを右クリック、
「Windowsメッセージハンドラの追加」
WM_CREATE(Windowが作られたときの処理)とWM_DESTROY(Windowを閉じる前の処理)を追加する。

最初は、WM_KEYDOWNも終了しやすいように付け加えておくのが良い。

CMainFrameに追加するもの

IDirectDraw7* m_pDD7;

// ウインドウを作る.
OnCreate()
{
    // ごちゃごちゃした処理の後ろに追加する

    // DirectDrawCreateEx()で、まず初期化。DirectDrawを取り出す。
    DirectDrawCreateEx(NULL, (void**)m_pDD7, IID_IDirectDraw7,NULL);
    m_pDD7->SetCooperativeLevel(m_hWnd, DDSCL_EXCLUSIVE | DDSCL_FULLSCREEN);
}

// WIndowを閉じる
OnDestroy() {
    // DirectDrawの開放
    m_pDD7->Release();
    // ごちゃごちゃした処理の前に追加する
}

OnKeyDown() {
    // 他の処理
    // 後ろまたは分岐処理で加える
    DestroyWindow();
}

とりあえず、ウィンドウに処理をくくり付けているのがWindowsの最も基本的な嫌な制約であるので、DirectDrawもウィンドウを作るところからはじまる。 Direct3D

初期化の手順が全く謎なのが、Direct3Dである。DirectDrawとは、どのように関わってくるのだろうか。

保持モード

まず、Direct3DRMCreate()で、RMオブジェクトを作る(初期化する)。
そこから作られるIDirect3DRMDeviceというのが、出力画面だ。出力画面がなければ、計算だけして悲しい・・・。

どのようなことができるかは、そのあとで解説。



[HOME]