Direct 3 Dベース——Direct 3 Dの初期化


まず、Direct初期化の概略手順を概説します(詳細は後述します):
1.インタフェースIDirect 3 D 9のポインタを取得する.このインタフェースは、システム物理ハードウェア装置の情報を取得し、インタフェースを作成するために使用される:IDirect 3 DDevice 9、インタフェースは、3 Dグラフィックを表示するために使用されるハードウェア物理装置を表すC++オブジェクトと見なすことができる.
2、デバイスの性能を検査し(D 3 DCAPS 9)、グラフィックスカードがハードウェア頂点の計算をサポートするかどうかを判断する.なぜなら、IDirect 3 DDevice 9インタフェースを作成するには、グラフィックスカードがこの機能をサポートするかどうかを明確にしなければならないからである.
3、D 3 DPRESENTを初期化するPARAMETERS構造の例.この構造は多くのデータメンバーで構成されており、D 3 DPRESENT_を通じてPARAMETERSの変数は、作成するIDirect 3 DDevice 9インタフェースの特性を決定します.
4、初期化された構造体D 3 DPRESENT_を利用するPARAMETERはIDirect 3 DDevice 9オブジェクト(C++オブジェクトで、私たちが最初に3 Dグラフィックを使用する物理デバイスを表す)を作成します.
注意:私たちは学習の段階でメイングラフィックスカードを使って私たちの画像を描くことができます.もしシステムにグラフィックスカードが1枚しかない場合、このグラフィックスカードは私たちのメイングラフィックスカードです.ローカルにどれだけ速いグラフィックスカードがあるかというと、現在使用されているグラフィックスカードがメイングラフィックスカードです(現在使用されているのはWindowsデスクトップを表示するためのグラフィックスカードです).
インタフェースIDirect 3 D 9のポインタの取得
Direct 3 Dを初期化するには、インタフェースIDirect 3 D 9へのポインタを取得する必要があります.専用のDirect 3 D関数を使用すると、簡単に座ることができます.
IDirect3D9* _d3d9;

d3d9 = Direct3DCreate9(D3D_SDK_VERSION);

関数Direct 3 DCreate 9のパラメータはD 3 D_でなければなりませんSDK_VERSIONは、このようにしてこそ、アプリケーションが正しいヘッダファイルを使用することを保証することができます.関数呼び出しに失敗した場合、NULLポインタが返されます.
上記のIDirect 3 D 9のオブジェクトには、主に2つの用途があります.デバイス列挙とIDirect 3 DDevice 9タイプのオブジェクトの作成です.
デバイス列挙とは、システムで使用可能な各グラフィックグラフィックスのパフォーマンス、表示モード、フォーマット、その他の情報を取得することです.たとえば、物理デバイスを表すIDirect 3 DDevice 9タイプのオブジェクトを作成するには、物理デバイスがサポートする表示モードやフォーマットなどの構成情報を知る必要があります.このような実行可能な構成を見つけるためには、インタフェース:IDirect 3 D 9の列挙方法を使用する必要があります.
ハードウェアの頂点演算の検証
メイングラフィックスのIDirect 3 DDevice 9タイプのオブジェクトを作成する場合は、そのオブジェクトを使用してポイント演算を行うタイプ、つまりハードウェア頂点演算を使用するかソフトウェア頂点演算を使用するかを指定する必要があります.ハードウェアのポイント演算をできるだけ使用できますが、すべてのグラフィックスカードがハードウェアの頂点演算をサポートしているかどうかは、まずグラフィックスカードがこのタイプの演算をサポートしているかどうかを確認する必要があります.
チェックするには、まずメイングラフィックスのパフォーマンスパラメータに基づいてIDirect 3 DDevice 9タイプのオブジェクトを初期化する必要があります.以下の方法で初期化します.
HRESULT IDirect3D9::GetDevice(
    UINT Adapter,    //         
    D3DDEVTYPE DeviceType;    //      (     :D3DDEVTYPE_HAL      :                                 D3DDEVTYPE_REF)
    D3DCAPS9* pCap    //                
)

次に、デバイスのパフォーマンスを確認します.
//         D3DCAPS9        
D3DCAPS9 caps;
d3d9->GetDeviceCaps(
    D3DADAPTER_DEFAULT,    //        
    devicetype,            //      ,   D3DDEVTYPE_HAL
    &caps                  //                 
)

//              
int vp = 0;
if( caps.DevCaps & D3DDEVCAPS_HWTRANSFORMANDLIGHT)
{
    //         ,               ,                vp
    vp = D3DCREATE_ HARDWARE_VERTEXPROCESSING;
}
else
{
    //          ,              vp
    vp = D3DCREATE_SOFTWARE_VERTEXPROCESSING;
}

注:IDirect 3 DDeviceタイプのオブジェクトを作成するときに、後で使用する頂点演算タイプを指定する必要があるため、頂点演算のタイプをvpに割り当てて保存します.
充填D 3 DPRESENT_PARAMETER構造体
Direct 3 D初期化の次のステップは、D 3 DPRESENT_を入力することです.PARAMETER構造体の例.
この構造は、作成されたIDirect 3 DDevice 9タイプのオブジェクトのいくつかの特性を指定するために使用され、その構造体の定義は以下の通りである.
typedef struct _D3DPRESENT_PARAMETERS_ {
    UINT                 BackBufferwidth;     //          ,     
    UINT                 BackBufferHeight;    //          ,      
    D3DFORMAT            BackBufferFormat;    //          (32   16 )
    UINT                 BackBuffercount;     //            ,   1,              
    D3DMULTISAMPLE_TYPE  MultiSampleType;     //               
    DWORD                MultiSampleQuality;  //          
    D3DSWAPEFFECT        SwapEffect;          //D3DSWAPEFFECT         ,                     ,      :D3DSWAPEFFECT_DISCARD     
    HWND                 hDevicewindow;       //          。              
    BOOL                 Windowed;            // true :    , false   :     
    BOOL                 EnableAutoDepthstencil;      //  true, Direct3D                
    D3DFORMAT            AutodepthStencilFormat;      //               (  :24       8            ,D3DFMT_D24S8)
    DWORD                Flags;                       //          
    UINT                 FullScreen_RefreshRateInHz;  //    ,            ,         :D3DPRESENT_RATE_DEFAULT
    UINT                 PresentationInterval;        //       ,        
)D3DPRESENT_PARAMETERS:

パラメータFlags:
Flagsのいくつかの追加の特性.0(タグなし)またはD 3 DPRESENTFLAGセットの1つのメンバーとして指定できます.このうち、2つのメンバーが一般的です.・D 3 DPRESENTFLAG_LOCKABLE_DEPTHBUFFERロック可能なバックグラウンドキャッシュを指定します.ロック可能なバックグラウンドキャッシュを使用すると、パフォーマンスが低下することに注意してください.・D3DPRESENTFLAG_DISCARD_DEPTHBUFFERは、次のバックグラウンドキャッシュのコミット時に、どの深さまたはテンプレートキャッシュが破棄されるかを指定します.「破棄」という言葉は、深さまたはテンプレートキャッシュメモリ内のコンテンツが破棄されたり無効になったりすることを意味します.これにより、パフォーマンスが向上します.
パラメータPresentationInterval:
・Presentationlnterval D 3 DPRESENTセットのメンバー.完全な適法間隔のリストについては、関連ドキュメントを参照してください.中には2人のメンバーがよく使われています.・D 3 DPRESENT_INTERVAL IMMEDIATE直ちに提出する.・D3DPRESENT_INTERVAL_DEFAULTはDirect 3 Dによってコミット頻度(present rate)を選択する.通常、この値はリフレッシュ頻度(refresh rate)に等しい.
この構造を埋め込む例は次のとおりです.
D3DPRESENT_PARAMETERS d3dpp;
 d3dpp. BackBufferWidth=800;
 d3dpp. BackBufferHeight=600;
 d3dpp. BackBufferFormat=D3DFMT_A8R8G8B8;//pixel format
 d3dpp. BackBufferCount=1;
 d3dpp. MultiSampleType=D3DMULTISAMPLE_NONE; 
 d3dpp. MultiSampleQuality =0;
 d3dpp. SwapEffectD3DSWAPEFFECT_DISCARD;
 d3dpp, hDevicewindow=hwnd;
 d3dpp. Windowed=false;//fullscreen
 d3dpp, EnableAutoDepthstenci1-true;
 d3dpp, AutoDepthStenci1Format =D3DFMT_D24s8;//depth format
 d3dpp. Flags = 0;
 d3dpp. Fu11Screen_RefreshRateInHz = D3DPRESENT_RATE_DEFAULT;
 d3dpp. PresentationIntervel=D3DPRESENT_INTERVAL_IMMEDIATE;

IDirect 3 DDevice 9インタフェースの作成
D3DPRESENT_PARAMETERS構造の充填が完了した後、IDirect 3 DDevice 9タイプのオブジェクトを作成するには、次の方法を使用します.
HRESULT IDirect3D9::CreatDevice(
    UINT Adapter,            //           IDirect3DDevice9          
    D3DDEVTYPE deviceType,   //           (    :D3DDEVTYPE_HAL,    :D3DDEVTYPE_REF)
    HWND hFocusWindows,      //          ,                      ,         ,       D3DPRESENT_PARAMETERS       d3dpp.hDeviceWindow      
    DWORD BehaviorFlags,     /*     D3DCREATE_HARDWARE_VERTEXPROCESSING 
D3DCREATE_SOFTWARE_VERTEXPROCESSING*/
    D3DPRESENT_PARAMETERS* pPresentationParameters,     //          D3DPRESENT_PARAMETERS     ,             。
    IDirect3DDevice9** ppReturnedDeviceInterface        //        
)

この関数の呼び出し例を次に示します.
IDirect3DDevice9 * device = 0;

hr = d3d9->CreatDevice(
    D3DADAPTER_DEFAULT, 
    D3DDEVTYPE_HAL,
    hwnd,
    D3DCREATE_HARDWARE_VERTEXPROCESSING,
    &d3dpp,
    &device
);

if (FAILED(hr))
{
    ::MessageBox(0,"CreatDevice() - FAILED",0,0);
    return 0 ;
}