第01章 何もしないDirectXアプリケーション。 次へ

ソース 実行ファイル
dx8_01.cpp dx8_01.exe

「何もしない」というタイトルを見て何の意味があるの?と思う方もいると思います。
ここで覚えて欲しいのは「DirectXの初期化」
要するにDirectXを使う為の前準備の方法です。

今回のプログラムではDirect3Dの初期化をしてWM_PAINTが呼ばれたときに
Window内を黒く塗りつぶすだけです。
だけどDirectXを使う上では絶対に必要になる初期化を
まずは徹底的におさえておきましょう。

ソースの簡易化を重点にしているのでHALモードのみ動作可能です。
(*このサンプルはビデオカードに3D機能がなければ動作しません)

出てくる関数:
関数名 詳細
IDirect3D8* Direct3DCreate8(
UINT /*このパラメータの値は 「D3D_SDK_VERSION」 でなければならない*/
);
Direct3D8 オブジェクトのインスタンスを作成する。
HRESULT GetAdapterDisplayMode(
UINT Adapter,/*プライマリ ディスプレイ アダプタを選択する場合は「D3DADAPTER_DEFAULT」にする*/
D3DDISPLAYMODE* pMode/*アダプタの現在のモードを記述する情報が格納される*/
);
アダプタの現在のディスプレイ モードを取得する。
HRESULT CreateDevice(
UINT Adapter,標準ではD3DADAPTER_DEFAULTを指定しましょう
D3DDEVTYPE DeviceType,目的のデバイス タイプを示す(フラグは後述)
HWND hFocusWindow,適用するWindowのハンドル
DWORD BehaviorFlags,Direct3D デバイスの全体的な動作を制御する(フラグは後述)
D3DPRESENT_PARAMETERS* pPresentationParameters,
IDirect3DDevice8** ppReturnedDeviceInterface
);

■DeviceTypeの値一覧■
D3DDEVTYPE_HAL=ラスタ化とシェーディングはハードウェアで行い、トランスフォームとライティングにはソフトウェア、ハードウェア、またはその両方を使用する。
D3DDEVTYPE_REF=Direct3Dの機能はソフトウェアで実行されます。無茶苦茶遅いです
D3DDEVTYPE_SW=IDirect3D8::RegisterSoftwareDevice を使用して Direct3D に登録されたプラグ可能なソフトウェア デバイス。
ディスプレイ アダプタを表すためのデバイスを作成する。
Release オブジェクトがメモリから解放される
#include <d3d8.h>//Direct3Dを使用する為にヘッダフィルをリンクする #include <d3dx8.h>//Direct3DXを使用する為にヘッダファイルをリンクする #pragma comment( lib,"d3d8.lib" )//必要なライブラリをリンクする #pragma comment( lib,"d3dx8.lib" )//必要なライブラリをリンクする LPDIRECT3D8 g_pD3D = NULL;//Direct3Dインスタンス保持用 LPDIRECT3DDEVICE8 g_pd3dDevice = NULL;//Direct3Dデバイス保持用 HRESULT InitD3D( HWND hWnd ) { //Direct3Dが使用可能か?(DirectX8が入ってるか?) if( NULL == ( g_pD3D = Direct3DCreate8( D3D_SDK_VERSION ) ) ) return E_FAIL; //現在のスクリーンモードを取得 D3DDISPLAYMODE d3ddm; if( FAILED( g_pD3D->GetAdapterDisplayMode( D3DADAPTER_DEFAULT, &d3ddm ) ) ) return E_FAIL; //取得したスクリーンモードに沿ってフォーマットを設定 D3DPRESENT_PARAMETERS d3dpp; ZeroMemory( &d3dpp, sizeof(d3dpp) ); d3dpp.Windowed = TRUE; d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD; d3dpp.BackBufferFormat = d3ddm.Format; //Direct3DをHALモードで使用可能にする。 if( FAILED( g_pD3D->CreateDevice( D3DADAPTER_DEFAULT, D3DDEVTYPE_HAL, hWnd, D3DCREATE_SOFTWARE_VERTEXPROCESSING, &d3dpp, &g_pd3dDevice ) ) ) { return E_FAIL; } return S_OK; } //----------------------------------------------------------------------------- //解放処理 //----------------------------------------------------------------------------- VOID Cleanup() { if( g_pd3dDevice != NULL) g_pd3dDevice->Release(); if( g_pD3D != NULL) g_pD3D->Release(); } //----------------------------------------------------------------------------- //描画処理 //----------------------------------------------------------------------------- VOID Render() { if( NULL == g_pd3dDevice ) return; //画面全体を指定色でクリア g_pd3dDevice->Clear( 0, NULL, D3DCLEAR_TARGET, D3DCOLOR_XRGB(0,0,0), 1.0f, 0 ); //BeginScene関数の後で始めて描画が出来る g_pd3dDevice->BeginScene(); //ここに描画処理を入れる //EndScene関数で描画が終了 g_pd3dDevice->EndScene(); //裏画面から表画面へ転送 g_pd3dDevice->Present( NULL, NULL, NULL, NULL ); } //----------------------------------------------------------------------------- //メッセージループ //----------------------------------------------------------------------------- LRESULT WINAPI MsgProc( HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam ) { switch( msg ) { case WM_PAINT: Render(); return 0; case WM_DESTROY: PostQuitMessage( 0 ); return 0; } return DefWindowProc( hWnd, msg, wParam, lParam ); } //----------------------------------------------------------------------------- // //----------------------------------------------------------------------------- INT WINAPI WinMain( HINSTANCE hInst, HINSTANCE, LPSTR, INT ) { WNDCLASSEX wc = { sizeof(WNDCLASSEX), CS_CLASSDC, MsgProc, 0L, 0L, GetModuleHandle(NULL), NULL, NULL, NULL, NULL, "D3D 1", NULL }; RegisterClassEx( &wc ); HWND hWnd = CreateWindow( "D3D 1", "ぶーにゃんのDX8プログラミング", WS_OVERLAPPED | WS_SYSMENU | WS_MINIMIZEBOX | WS_VISIBLE, 100, 100, 240+ GetSystemMetrics(SM_CXDLGFRAME) * 2, 160+ GetSystemMetrics(SM_CYDLGFRAME) * 2 + GetSystemMetrics(SM_CYCAPTION), GetDesktopWindow(), NULL, wc.hInstance, NULL ); if( SUCCEEDED( InitD3D( hWnd ) ) ) { ShowWindow( hWnd, SW_SHOWDEFAULT ); UpdateWindow( hWnd ); MSG msg; while( GetMessage( &msg, NULL, 0, 0 ) ) { TranslateMessage( &msg ); DispatchMessage( &msg ); } } Cleanup(); UnregisterClass( "D3D 1", wc.hInstance ); return 0; }