HRESULT CreateDevice( UINT Adapter , D3DDEVTYPE DeviceType , HWND hFocusWindow , DWORD BehaviorFlags, D3DPRESENT_PARAMETERS* pPresentationParameters , IDirect3DDevice8** ppReturnedDeviceInterface );Adapter には、使用するグラフィック・アダプタを選択します
定数 | 解説 |
---|---|
D3DCREATE_FPU_PRESERVE | 不動小数点ユニット FPU の例外を可能とすることを アプリケーションが必要としていることを示す ただし、パフォーマンスが低下することがある |
D3DCREATE_HARDWARE_VERTEXPROCESSING | 頂点処理をハードウェアで行う |
D3DCREATE_MIXED_VERTEXPROCESSING | 頂点処理を、ハードウェアとソフトウェアの両方で行う |
D3DCREATE_MULTITHREADED | 安全なマルチスレッドであることを要求する マルチスレッドアプリケーションの場合に指定する ただし、パフォーマンスが低下することがある |
D3DCREATE_PUREDEVICE | 頂点処理のためのエミュレーションサービスを行わない すなわち、常にデバイスによる頂点処理を行う |
D3DCREATE_SOFTWARE_VERTEXPROCESSING | 頂点処理をソフトウェアで行う |
D3DCREATE_DISABLE_DRIVER_MANAGEMENT | ドライバの代わりに、Direct3D がリソース管理を行う DirectX7 以下で使用します |
定数 | 解説 |
---|---|
D3DERR_INVALIDCALL | メソッドが無効である おそらく、パラメータの指定が間違っている |
D3DERR_NOTAVAILABLE | このデバイスは指定の機能をサポートしない |
D3DERR_OUTOFVIDEOMEMORY | 操作の実行に必要なビデオメモリない |
typedef enum _D3DDEVTYPE { D3DDEVTYPE_HAL = 1, D3DDEVTYPE_REF = 2, D3DDEVTYPE_SW = 3, D3DDEVTYPE_FORCE_DWORD = 0xffffffff } D3DDEVTYPE;D3DDEVTYPE_HAL は、ハードウェアで描画処理を行うことを示します
typedef struct _D3DPRESENT_PARAMETERS_ { UINT BackBufferWidth; UINT BackBufferHeight; D3DFORMAT BackBufferFormat; UINT BackBufferCount; D3DMULTISAMPLE_TYPE MultiSampleType; D3DSWAPEFFECT SwapEffect; HWND hDeviceWindow; BOOL Windowed; BOOL EnableAutoDepthStencil; D3DFORMAT AutoDepthStencilFormat; DWORD Flags; UINT FullScreen_RefreshRateInHz; UINT FullScreen_PresentationInterval; } D3DPRESENT_PARAMETERS;BackBufferWidth にはバッファの横幅を
定数 | 解説 |
---|---|
D3DPRESENT_RATE_DEFAULT | ランタイムはプレゼンテーション速度を選択する ウィンドウ モードの場合は、現在の速度を使用する |
D3DPRESENT_RATE_UNLIMITED | プレゼンテーション速度は ハードウェアがフレームを提供できる速さで動作する |
定数 | 解説 |
---|---|
D3DPRESENT_INTERVAL_DEFAULT | デフォルトの値 (0) |
D3DPRESENT_INTERVAL_IMMEDIATE | プレゼンテーション処理に直接影響する場合がある ドライバは垂直帰線間隔を待たない |
D3DPRESENT_INTERVAL_ONE | ドライバは垂直帰線間隔を待つ プレゼンテーション処理への影響は スクリーン リフレッシュほど頻繁ではない |
D3DPRESENT_INTERVAL_TWO | ドライバは垂直帰線間隔を待つ プレゼンテーション処理への影響は スクリーン リフレッシュ (1 回おき) ほど頻繁ではない |
D3DPRESENT_INTERVAL_THREE | ドライバは垂直帰線間隔を待つ プレゼンテーション処理への影響は スクリーン リフレッシュ (2 回おき) ほど頻繁ではない |
D3DPRESENT_INTERVAL_FOUR | ドライバは垂直帰線間隔を待つ プレゼンテーション処理への影響は スクリーン リフレッシュ (3 回おき) ほど頻繁ではない |
typedef enum _D3DFORMAT { D3DFMT_UNKNOWN = 0, D3DFMT_R8G8B8 = 20, D3DFMT_A8R8G8B8 = 21, D3DFMT_X8R8G8B8 = 22, D3DFMT_R5G6B5 = 23, D3DFMT_X1R5G5B5 = 24, D3DFMT_A1R5G5B5 = 25, D3DFMT_A4R4G4B4 = 26, D3DFMT_R3G3B2 = 27, D3DFMT_A8 = 28, D3DFMT_A8R3G3B2 = 29, D3DFMT_X4R4G4B4 = 30, D3DFMT_A8P8 = 40, D3DFMT_P8 = 41, D3DFMT_L8 = 50, D3DFMT_A8L8 = 51, D3DFMT_A4L4 = 52, D3DFMT_V8U8 = 60, D3DFMT_L6V5U5 = 61, D3DFMT_X8L8V8U8 = 62, D3DFMT_Q8W8V8U8 = 63, D3DFMT_V16U16 = 64, D3DFMT_W11V11U10 = 65, D3DFMT_UYVY = MAKEFOURCC('U', 'Y', 'V', 'Y'), D3DFMT_YUY2 = MAKEFOURCC('Y', 'U', 'Y', '2'), D3DFMT_DXT1 = MAKEFOURCC('D', 'X', 'T', '1'), D3DFMT_DXT2 = MAKEFOURCC('D', 'X', 'T', '2'), D3DFMT_DXT3 = MAKEFOURCC('D', 'X', 'T', '3'), D3DFMT_DXT4 = MAKEFOURCC('D', 'X', 'T', '4'), D3DFMT_DXT5 = MAKEFOURCC('D', 'X', 'T', '5'), D3DFMT_D16_LOCKABLE = 70, D3DFMT_D32 = 71, D3DFMT_D15S1 = 73, D3DFMT_D24S8 = 75, D3DFMT_D16 = 80, D3DFMT_D24X8 = 77, D3DFMT_D24X4S4 = 79, D3DFMT_VERTEXDATA = 100, D3DFMT_INDEX16 = 101, D3DFMT_INDEX32 = 102, D3DFMT_FORCE_DWORD = 0xFFFFFFFF } D3DFORMAT;この列挙型の各メンバの意味は次のようになっています
メンバ | 解説 |
---|---|
D3DFMT_UNKNOWN | サーフェス フォーマットは不明である |
D3DFMT_R8G8B8 | 24 ビットの RGB ピクセル フォーマット |
D3DFMT_A8R8G8B8 | アルファ付きの 32 ビット ARGB ピクセル フォーマット |
D3DFMT_X8R8G8B8 | 32 ビットの RGB ピクセル フォーマットで そのうち 8 ビットは各色のために確保されている |
D3DFMT_R5G6B5 | 16 ビットの RGB ピクセル フォーマット |
D3DFMT_X1R5G5B5 | 16 ビットのピクセル フォーマットで そのうち 5 ビットは各色のために確保されている |
D3DFMT_A1R5G5B5 | 16 ビットのピクセル フォーマットで 各色に 5 ビットが、アルファ (透過型テクセル) に 1 ビットが、それぞれ確保されている |
D3DFMT_A4R4G4B4 | 16 ビットの ARGB ピクセル フォーマット |
D3DFMT_R3G3B2 | 8 ビットの RGB テクスチャ フォーマット |
D3DFMT_A8 | 8 ビットのアルファのみ |
D3DFMT_A8R3G3B2 | 16 ビットの ARGB テクスチャ フォーマット |
D3DFMT_X4R4G4B4 | 16 ビットの RGB ピクセル フォーマットで そのうち 4 ビットは各色のために確保されている |
D3DFMT_A8P8 | サーフェスは、8 ビットのアルファが付いた 8 ビットのカラー インデックス付き |
D3DFMT_P8 | サーフェスは、8 ビットのカラー インデックス付き |
D3DFMT_L8 | 8 ビットの輝度のみ |
D3DFMT_A8L8 | 16 ビットのアルファ輝度 |
D3DFMT_A4L4 | 8 ビットのアルファ輝度 |
D3DFMT_V8U8 | 16 ビットのバンプマップ フォーマット |
D3DFMT_L6V5U5 | 輝度の付いた 16 ビットのバンプマップ フォーマット |
D3DFMT_X8L8V8U8 | 輝度付きの 32 ビット バンプマップ フォーマットで 8 ビットは各要素のために確保されている |
D3DFMT_Q8W8V8U8 | 32 ビットのバンプマップ フォーマット |
D3DFMT_V16U16 | 32 ビットのバンプマップ フォーマット |
D3DFMT_W11V11U10 | 32 ビットのバンプマップ フォーマット |
D3DFMT_UYVY | UYVY フォーマット (PC98 準拠) |
D3DFMT_YUY2 | YUY2 フォーマット (PC98 準拠) |
D3DFMT_DXT1 | DXT1 圧縮テクスチャ フォーマット |
D3DFMT_DXT2 | DXT2 圧縮テクスチャ フォーマット |
D3DFMT_DXT3 | DXT3 圧縮テクスチャ フォーマット |
D3DFMT_DXT4 | DXT4 圧縮テクスチャ フォーマット |
D3DFMT_DXT5 | DXT5 圧縮テクスチャ フォーマット |
D3DFMT_D16_LOCKABLE | 16 ビットの Z バッファ ビット深度 これはアプリケーションでロック可能なサーフェス フォーマットである |
D3DFMT_D32 | 32 ビットの Z バッファ ビット深度 |
D3DFMT_D15S1 | 16 ビットの Z バッファ ビット深度で 15 ビットが深度チャネルに、1 ビットがステンシル チャネルに確保されている |
D3DFMT_D24S8 | 32 ビットの Z バッファ ビット深度で 24 ビットが深度チャネルに、8 ビットがステンシル チャネルに確保されている |
D3DFMT_D16 | 16 ビットの Z バッファ ビット深度 |
D3DFMT_D24X8 | 32 ビットの Z バッファ ビット深度で 24 ビットが深度チャネルに確保されている |
D3DFMT_D24X4S4 | 32 ビットの Z バッファ ビット深度で 24 ビットが深度チャネルに、4 ビットがステンシル チャネルに確保されている |
D3DFMT_VERTEXDATA | 頂点バッファ サーフェスを記述する |
D3DFMT_INDEX16 | 16 ビットのインデックス バッファのビット深度 |
D3DFMT_INDEX32 | 32 ビットのインデックス バッファのビット深度 |
D3DFMT_FORCE_DWORD | この列挙型を強制的に 32 ビット サイズにコンパイルする この値は使用されていない |
typedef enum _D3DMULTISAMPLE_TYPE { D3DMULTISAMPLE_NONE = 0, D3DMULTISAMPLE_2_SAMPLES = 2, D3DMULTISAMPLE_3_SAMPLES = 3, D3DMULTISAMPLE_4_SAMPLES = 4, D3DMULTISAMPLE_5_SAMPLES = 5, D3DMULTISAMPLE_6_SAMPLES = 6, D3DMULTISAMPLE_7_SAMPLES = 7, D3DMULTISAMPLE_8_SAMPLES = 8, D3DMULTISAMPLE_9_SAMPLES = 9, D3DMULTISAMPLE_10_SAMPLES = 10, D3DMULTISAMPLE_11_SAMPLES = 11, D3DMULTISAMPLE_12_SAMPLES = 12, D3DMULTISAMPLE_13_SAMPLES = 13, D3DMULTISAMPLE_14_SAMPLES = 14, D3DMULTISAMPLE_15_SAMPLES = 15, D3DMULTISAMPLE_16_SAMPLES = 16, D3DMULTISAMPLE_FORCE_DWORD = 0xffffffff } D3DMULTISAMPLE_TYPE;この列挙型のメンバは、次のような意味を持っています
メンバ | 解説 |
---|---|
D3DMULTISAMPLE_NONE | いずれのレベルのフルシーン マルチサンプリングも利用できない |
D3DMULTISAMPLE_2_SAMPLES 〜 D3DMULTISAMPLE_16_SAMPLES | そのレベルのフルシーン マルチサンプリングを利用できる |
D3DMULTISAMPLE_FORCE_DWORD | この列挙型を強制的に 32 ビット サイズにコンパイルする この値は使用されていない |
typedef enum _D3DSWAPEFFECT { D3DSWAPEFFECT_DISCARD = 1, D3DSWAPEFFECT_FLIP = 2, D3DSWAPEFFECT_COPY = 3, D3DSWAPEFFECT_COPY_VSYNC = 4, D3DSWAPEFFECT_FORCE_DWORD = 0xFFFFFFFF } D3DSWAPEFFECT;この列挙型のメンバは、次のような意味を持ちます
メンバ | 解説 |
---|---|
D3DSWAPEFFECT_DISCARD | スワップ エフェクトの D3DSWAPEFFECT_FLIP D3DSWAPEFFECT_COPY、または D3DSWAPEFFECT_COPY_VSYNC を使って スワップ チェーンを作成した場合、ランタイムは IDirect3DDevice8::Present 処理が バック バッファの内容に一切影響しないことを保証する ただし、ウィンドウ スワップ チェーンのフリップ セマンティクスや フルスクリーン スワップ チェーンのコピー セマンティクスを実装する際などには この保証を満たすためにかなりのビデオ メモリのオーバーヘッドや 処理のオーバーヘッドが伴うことがある アプリケーションでは D3DSWAPEFFECT_DISCARD スワップ エフェクトを使うことで これらのオーバーヘッドを回避することができ 最も効率的なスワップ チェーンの表現方法を、ディスプレイ ドライバ側で選択できる また、これは、D3DPRESENT_PARAMETERS の MultiSampleType メンバに D3DMULTISAMPLE_NONE 以外の値を指定した際に 使用できる唯一のスワップ エフェクトである D3DSWAPEFFECT_FLIP を使用するスワップ チェーンと同様 D3DSWAPEFFECT_DISCARD を使用するスワップ チェーンは複数の バック バッファを含んでいることがあり これらのバッファには IDirect3DDevice8::GetBackBuffer または IDirect3DSwapChain8::GetBackBuffer を使ってアクセスできる スワップ チェーンは待ち行列として見なすことができ この待ち行列の中では、次の Present 処理で表示されるバック バッファに 常にインデックス 0 が付き、いったん表示されたバッファは待ち行列から破棄される このスワップ エフェクトを使用するアプリケーションでは 破棄されるバック バッファの内容を推測することはできないため バック バッファ全体を更新した後で Present 処理を呼び出す必要がある これは強制的なことではないが、デバッグ バージョンのランタイムは 破棄されるバック バッファの内容を任意のデータで上書きできるので 開発者はアプリケーションがバック バッファ サーフェス全体を 正しく更新していることを確認できる フルスクリーン スワップ チェーンの場合 デバイスまたはスワップ チェーンの作成時に D3DPRESENT_PARAMETERS 構造体の FullScreen_PresentationInterval メンバに 割り当てられた値によってプレゼンテーション レートが決まる この値が D3DPRESENT_INTERVAL_IMMEDIATE でない場合 プレゼンテーションはモニタの垂直同期と同期される ウィンドウ スワップ チェーンの場合、プレゼンテーションは コピー処理によって実装されて、常に即座に実行される |
D3DSWAPEFFECT_FLIP | スワップ チェーンには複数のバック バッファが含まれることがあり フロント バッファを含む巡回待ち行列として見なすことができる この待ち行列の中では バック バッファに常に 0 から N - 1 (N はバック バッファの数) までの 連続した数字が付けられる したがって、0 はプレゼンテーションされる最も古いバッファを示す Present が呼び出されると、待ち行列が「循環」されて フロント バッファがバック バッファ (N - 1) になり バック バッファ 0 が新しいフロント バッファになる フルスクリーン スワップ チェーンの場合 デバイスまたはスワップ チェーンの作成時に D3DPRESENT_PARAMETERS 構造体の FullScreen_PresentationInterval メンバに 割り当てられた値によってプレゼンテーション レートが決まる この値が D3DPRESENT_INTERVAL_IMMEDIATE でない場合 プレゼンテーションはモニタの垂直同期と同期される ウィンドウ スワップ チェーンの場合、フリッピングはコピー処理によって実装され プレゼンテーションは常に即座に実行される |
D3DSWAPEFFECT_COPY | スワップ エフェクトは、単一のバック バッファを構成する スワップ チェーンに対してのみ指定できる ウィンドウ スワップ チェーンの場合もフルスクリーン スワップ チェーンの場合も ランタイムはコピーベースの Present 処理によるセマンティクスを保証する つまり、バック バッファの内容が変更されることはなく フリップベースの Present 処理で行われるように フロント バッファの内容で置き換えられることはない ウィンドウ スワップ チェーンの場合、Present 処理によってバック バッファの内容が ターゲット ウィンドウのクライアント領域に即座にコピーされる コピー内容とディスプレイ アダプタの垂直帰線間隔との同期処理は行われないため 「テアリング」効果が現れることがある ウィンドウ アプリケーションでは、そのようなテアリング効果を消したり 最小限に抑えるために、D3DSWAPEFFECT_COPY_VSYNC を使うことができる フルスクリーン スワップ チェーンの場合、ランタイムはフリップ処理と コピー処理の組み合わせを使ってPresent 処理を行う したがって、プレゼンテーションはディスプレイ アダプタの垂直帰線と同期され そのレートは選択されたプレゼンテーション間隔によって制御される ただし、D3DPRESENT_INTERVAL_IMMEDIATE フラグで 指定されたスワップ チェーンは例外である (D3DPRESENT_PARAMETERS 構造体の FullScreen_PresentationInterval メンバの説明を参照すること) この場合、Present 処理は垂直帰線を待機せずに バック バッファの内容をフロント バッファに直接コピーする |
D3DSWAPEFFECT_COPY_VSYNC | D3DSWAPEFFECT_COPY と同様、このスワップ エフェクトは 単一のバック バッファで構成されるスワップ チェーンでのみ使用できる 上の D3DSWAPEFFECT_COPY で説明したように スワップ チェーンに適用される Present 処理が コピー セマンティクスを提示することが保証される ウィンドウ スワップ チェーンの場合、Present 処理によってバック バッファの内容が ターゲット ウィンドウのクライアント領域に即座にコピーされる アダプタがディスプレイ上の転送先の矩形内でスキャンしている間 ランタイムはコピー処理を避けてテアリング効果を排除しようとする また、ランタイムは、アダプタのリフレッシュ間隔の間に コピー処理をせいぜい 1 回実行して、プレゼンテーションの頻度を制限する ただし、アダプタがラスタ ステータスの報告機能をサポートしていない場合には スワップ チェーンは D3DSWAPEFFECT_COPY スワップ エフェクトで 作成されたかのような働きをする (D3DCAPS8 の Caps メンバについては D3DCAPS_READ_SCANLINE フラグ値の説明を参照すること) フルスクリーン スワップ チェーンの場合 D3DSWAPEFFECT_COPY_VSYNC は D3DSWAPEFFECT_COPY と同じである ただし、D3DPRESENT_INTERVAL_IMMEDIATE フラグは D3DSWAPEFFECT_COPY_VSYNC と共に使用した場合には何も効果がない (D3DPRESENT_PARAMETERS 構造体の FullScreen_PresentationInterval メンバの説明を参照すること) |
D3DSWAPEFFECT_FORCE_DWORD | この列挙型を強制的に 32 ビット サイズにコンパイルする この値は使用されていない |
HRESULT GetAdapterDisplayMode( UINT Adapter , D3DDISPLAYMODE* pMode );Adapter には、対象のアダプタのインデックスを指定します
typedef struct _D3DDISPLAYMODE { UINT Width; UINT Height; UINT RefreshRate; D3DFORMAT Format; } D3DDISPLAYMODE;width にはスクリーンの幅、Height には高さを指定します
#include <windows.h> #include <d3d8.h> #define TITLE TEXT("Kitty on your lap") IDirect3D8 * pDirect3D; IDirect3DDevice8 * pD3Device; LRESULT CALLBACK WndProc(HWND hWnd , UINT msg , WPARAM wp , LPARAM lp) { switch (msg) { case WM_DESTROY: PostQuitMessage(0); return 0; } return DefWindowProc(hWnd , msg , wp , lp); } int WINAPI WinMain(HINSTANCE hInstance , HINSTANCE hPrevInstance , PSTR lpCmdLine , int nCmdShow) { MSG msg; HWND hWnd; WNDCLASS winc; D3DPRESENT_PARAMETERS d3dpp; D3DDISPLAYMODE d3ddm; pDirect3D = Direct3DCreate8(D3D_SDK_VERSION); pDirect3D->GetAdapterDisplayMode(D3DADAPTER_DEFAULT , &d3ddm); ZeroMemory(&d3dpp , sizeof (D3DPRESENT_PARAMETERS)); d3dpp.BackBufferFormat = d3ddm.Format; d3dpp.BackBufferCount = 1; d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD; d3dpp.Windowed = TRUE; winc.style = CS_HREDRAW | CS_VREDRAW; winc.lpfnWndProc = WndProc; winc.cbClsExtra = winc.cbWndExtra = 0; winc.hInstance = hInstance; winc.hIcon = LoadIcon(NULL , IDI_APPLICATION); winc.hCursor = LoadCursor(NULL , IDC_ARROW); winc.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH); winc.lpszMenuName = NULL; winc.lpszClassName = TEXT("KITTY"); if (!RegisterClass(&winc)) return 0; hWnd = CreateWindow( TEXT("KITTY") , TITLE , WS_OVERLAPPEDWINDOW | WS_VISIBLE , CW_USEDEFAULT , CW_USEDEFAULT , CW_USEDEFAULT , CW_USEDEFAULT , NULL , NULL , hInstance , NULL ); if (!hWnd) return 0; pDirect3D->CreateDevice( D3DADAPTER_DEFAULT , D3DDEVTYPE_HAL , hWnd , D3DCREATE_SOFTWARE_VERTEXPROCESSING , &d3dpp , &pD3Device ); while (GetMessage(&msg , NULL , 0 , 0 )) { TranslateMessage(&msg); DispatchMessage(&msg); } pDirect3D->Release(); pD3Device->Release(); return msg.wParam; }このプログラムを実行すると、何の変哲もないウィンドウが表示されます
HRESULT CreateDevice( UINT Adapter , D3DDEVTYPE DeviceType , HWND hFocusWindow , DWORD BehaviorFlags, D3DPRESENT_PARAMETERS* pPresentationParameters , IDirect3DDevice8** ppReturnedDeviceInterface );ディスプレイアダプタのデバイスを作成します
定数 | 解説 |
---|---|
D3DCREATE_FPU_PRESERVE | 不動小数点ユニット FPU の例外を可能とすることを アプリケーションが必要としていることを示す ただし、パフォーマンスが低下することがある |
D3DCREATE_HARDWARE_VERTEXPROCESSING | 頂点処理をハードウェアで行う |
D3DCREATE_MIXED_VERTEXPROCESSING | 頂点処理を、ハードウェアとソフトウェアの両方で行う |
D3DCREATE_MULTITHREADED | 安全なマルチスレッドであることを要求する マルチスレッドアプリケーションの場合に指定する ただし、パフォーマンスが低下することがある |
D3DCREATE_PUREDEVICE | 頂点処理のためのエミュレーションサービスを行わない すなわち、常にデバイスによる頂点処理を行う |
D3DCREATE_SOFTWARE_VERTEXPROCESSING | 頂点処理をソフトウェアで行う |
D3DCREATE_DISABLE_DRIVER_MANAGEMENT | ドライバの代わりに、Direct3D がリソース管理を行う DirectX7 以下で使用します |
定数 | 解説 |
---|---|
D3DERR_INVALIDCALL | メソッドが無効である おそらく、パラメータの指定が間違っている |
D3DERR_NOTAVAILABLE | このデバイスは指定の機能をサポートしない |
D3DERR_OUTOFVIDEOMEMORY | 操作の実行に必要なビデオメモリない |
HRESULT GetAdapterDisplayMode( UINT Adapter , D3DDISPLAYMODE* pMode );アダプターの現在のディスプレイモードを取得します