Win32 API 日本語リファレンス
ホームGraphics.Direct3D9 › IDirect3D9

IDirect3D9

COM
IID81bdcbca-64d4-426d-ae8d-ad0147f4275c継承元IUnknown自前メソッド開始 vtbl3

公式ドキュメント

IDirect3D9 (d3d9.h) インターフェイス。アプリケーションは IDirect3D9 インターフェイスのメソッドを使用して、Microsoft Direct3D オブジェクトを作成し、環境をセットアップします。

解説(Remarks)

IDirect3D9 インターフェイスは、Direct3DCreate9 関数を呼び出すことで取得します。

LPDIRECT3D9 型および PDIRECT3D9 型は、IDirect3D9 インターフェイスへのポインターとして定義されています。

typedef struct IDirect3D9 *LPDIRECT3D9, *PDIRECT3D9;

メソッド 14

vtbl = vtable インデックス(0始まり)。HSP等からCOMメソッドをインデックス指定で呼ぶ際に使用します。0〜2 は IUnknown。

vtbl 3 HRESULT RegisterSoftwareDevice(void* pInitializeFunction)

IDirect3D9::RegisterSoftwareDevice メソッド (d3d9.h) は、プラグイン可能なソフトウェアデバイスを登録します。

pInitializeFunctionvoid*inout登録するソフトウェアデバイスの初期化関数へのポインター。

戻り値

型: HRESULT

メソッドが成功した場合、戻り値は D3D_OK です。失敗した場合、戻り値は次のいずれかになります: D3DERR_INVALIDCALL (メソッド呼び出しが無効です。たとえば、メソッドのパラメーターに無効な値が指定されている場合など)、D3DERR_OUTOFVIDEOMEMORY。

解説(Remarks)

ユーザーのコンピューターが 3D 処理に対する特別なハードウェアアクセラレーションを備えていない場合、アプリケーションはソフトウェアで 3D ハードウェアをエミュレートできます。ソフトウェアラスタライズデバイスは、カラー 3D ハードウェアの機能をソフトウェアでエミュレートします。ソフトウェアデバイスは hal よりも動作が低速です。ただし、ソフトウェアデバイスは CPU がサポートする特殊命令を活用して性能を高めます。命令セットには、一部の AMD プロセッサがサポートする AMD 3DNow! 命令セットや、多くの Intel プロセッサがサポートする MMX 命令セットがあります。Direct3D は、変換とライティングの処理を高速化するために 3D-Now! 命令セットを、ラスタライズを高速化するために MMX 命令セットを使用します。

ソフトウェアデバイスは、ハードウェアデバイスドライバーインターフェイス (DDI) に類似したインターフェイスを介して Direct3D と通信します。

ソフトウェアデバイスはアプリケーションによって読み込まれ、IDirect3D9 オブジェクトに登録されます。Direct3D はレンダリングにそのソフトウェアデバイスを使用します。

プラグイン可能なソフトウェアデバイスを開発するためのドキュメントとヘッダーは、Direct3D ドライバー開発キット (DDK) で提供されています。

vtbl 4 DWORD GetAdapterCount()

IDirect3D9::GetAdapterCount メソッド (d3d9.h) は、システム上のアダプター数を返します。

戻り値

型: UINT

この IDirect3D9 インターフェイスがインスタンス化された時点でシステムに存在するアダプター数を示す UINT 値。

vtbl 5 HRESULT GetAdapterIdentifier(DWORD Adapter, DWORD Flags, D3DADAPTER_IDENTIFIER9* pIdentifier)

IDirect3D9::GetAdapterIdentifier メソッド (d3d9.h) は、IDirect3D9 インターフェイスがインスタンス化された時点でシステムに存在する物理ディスプレイアダプターの情報を取得します。

AdapterDWORDinディスプレイアダプターを示す序数。D3DADAPTER_DEFAULT は常にプライマリディスプレイアダプターを表します。このパラメーターの最小値は 0 で、最大値は GetAdapterCount が返す値から 1 を引いた値です。
FlagsDWORDin

Flags は D3DADAPTER_IDENTIFIER9WHQLLevel メンバーを設定します。Flags には 0 または D3DENUM_WHQL_LEVEL を指定できます。D3DENUM_WHQL_LEVEL を指定した場合、この呼び出しは新しい Microsoft Windows Hardware Quality Labs (WHQL) 証明書をダウンロードするためにインターネットに接続することがあります。

Direct3D 9 と Direct3D 9Ex の違い:

D3DENUM_WHQL_LEVEL は、Windows Vista、Windows Server 2008、Windows 7、Windows Server 2008 R2 (またはそれ以降のオペレーティングシステム) 上で動作する Direct3D9Ex では非推奨です。これらのオペレーティングシステムでは、ドライバーの状態を確認せずに D3DADAPTER_IDENTIFIER9WHQLLevel メンバーに 1 を返します。

pIdentifierD3DADAPTER_IDENTIFIER9*inoutこのアダプターを説明する情報が格納される D3DADAPTER_IDENTIFIER9 構造体へのポインター。Adapter がシステム内のアダプター数以上の場合、この構造体はゼロクリアされます。

戻り値

型: HRESULT

メソッドが成功した場合、戻り値は D3D_OK です。Adapter が範囲外の場合、Flags に認識できないパラメーターが含まれる場合、または pIdentifier が NULL か書き込み不可能なメモリを指している場合は、D3DERR_INVALIDCALL が返されます。

vtbl 6 DWORD GetAdapterModeCount(DWORD Adapter, D3DFORMAT Format)

IDirect3D9::GetAdapterModeCount メソッド (d3d9.h) は、このアダプターで利用可能なディスプレイモードの数を返します。

AdapterDWORDinディスプレイアダプターを示す序数。D3DADAPTER_DEFAULT は常にプライマリディスプレイアダプターを表します。
FormatD3DFORMATinD3DFORMAT を使用してサーフェスの種類のフォーマットを指定します。有効なフォーマットについては EnumAdapterModes を参照してください。

戻り値

型: UINT

このメソッドは、このアダプターのディスプレイモード数を返します。Adapter がシステム上のアダプター数以上の場合はゼロを返します。

vtbl 7 HRESULT EnumAdapterModes(DWORD Adapter, D3DFORMAT Format, DWORD Mode, D3DDISPLAYMODE* pMode)

IDirect3D9::EnumAdapterModes メソッド (d3d9.h) は、指定したアダプターが要求されたフォーマットとディスプレイモードをサポートするかどうかをデバイスに問い合わせます。

AdapterDWORDin列挙するディスプレイアダプターを示す序数。D3DADAPTER_DEFAULT は常にプライマリディスプレイアダプターを表します。この値がシステム内のディスプレイアダプター数以上の場合、このメソッドは D3DERR_INVALIDCALL を返します。
FormatD3DFORMATin許可されるピクセルフォーマット。「解説」を参照してください。
ModeDWORDinディスプレイモードのインデックスを表します。これは 0 以上、GetAdapterModeCount が返す値から 1 を引いた値以下の符号なし整数です。
pModeD3DDISPLAYMODE*inout利用可能なディスプレイモードを受け取る D3DDISPLAYMODE 型へのポインター。「解説」を参照してください。

戻り値

型: HRESULT

解説(Remarks)

アプリケーションがディスプレイモードとフォーマットを EnumAdapterModes に渡すと、ディスプレイモードが返されます。このメソッドをループ内で使用すれば、利用可能なすべてのディスプレイモードを列挙できます。

アプリケーションがフォーマットを指定すると、列挙はそのフォーマットに厳密に一致するディスプレイモードに限定されます (アルファは無視されます)。許可されるフォーマット (D3DFORMAT のメンバー) は次のとおりです。

さらに EnumAdapterModes は、ピクセルフォーマット 565 と 555 を等価として扱い、正しいバージョンを返します。この違いが意味を持つのは、アプリケーションがバックバッファーをロックする場合のみであり、そのためにアプリケーションが明示的に設定しなければならないフラグがあります。
vtbl 8 HRESULT GetAdapterDisplayMode(DWORD Adapter, D3DDISPLAYMODE* pMode)

IDirect3D9::GetAdapterDisplayMode メソッド (d3d9.h) は、アダプターの現在のディスプレイモードを取得します。

AdapterDWORDin問い合わせ対象のディスプレイアダプターを示す序数。D3DADAPTER_DEFAULT は常にプライマリディスプレイアダプターを表します。
pModeD3DDISPLAYMODE*inout現在のアダプターのモードを説明する情報が格納される D3DDISPLAYMODE 構造体へのポインター。

戻り値

型: HRESULT

メソッドが成功した場合、戻り値は D3D_OK です。

Adapter が範囲外の場合、または pMode が無効な場合、このメソッドは D3DERR_INVALIDCALL を返します。

解説(Remarks)

ディスプレイが 2:10:10:10 のような拡張フォーマットになっている場合、GetAdapterDisplayMode は正しいフォーマットを返しません。代わりに X8R8G8B8 フォーマットを返します。

vtbl 9 HRESULT CheckDeviceType(DWORD Adapter, D3DDEVTYPE DevType, D3DFORMAT AdapterFormat, D3DFORMAT BackBufferFormat, BOOL bWindowed)

IDirect3D9::CheckDeviceType メソッド (d3d9.h) は、ハードウェアアクセラレーション対応のデバイスタイプをこのアダプターで使用できるかどうかを確認します。

AdapterDWORDin列挙するディスプレイアダプターを示す序数。D3DADAPTER_DEFAULT は常にプライマリディスプレイアダプターを表します。この値がシステム内のディスプレイアダプター数以上の場合、このメソッドは D3DERR_INVALIDCALL を返します。
DevTypeD3DDEVTYPEin確認するデバイスタイプを示す D3DDEVTYPE 列挙型のメンバー。
AdapterFormatD3DFORMATinデバイスタイプを確認する対象となるアダプターディスプレイモードのフォーマットを示す D3DFORMAT 列挙型のメンバー。たとえば、一部のデバイスは 16 ビット/ピクセルのモードでのみ動作します。
BackBufferFormatD3DFORMATin

バックバッファーのフォーマット。フォーマットの詳細については D3DFORMAT を参照してください。この値はレンダーターゲットフォーマットのいずれかである必要があります。現在のフォーマットは GetAdapterDisplayMode で取得できます。

ウィンドウモードのアプリケーションでは、ハードウェアが色変換をサポートしていれば、バックバッファーのフォーマットがディスプレイモードのフォーマットと一致する必要はありません。指定可能なバックバッファーフォーマットの組み合わせには制約がありますが、ランタイムは有効なバックバッファーフォーマットを任意のデスクトップフォーマットへプレゼントすることを許可します。また、デバイスは通常 8 ビット/ピクセルのモードでは動作しないため、デスクトップ上でデバイスが動作可能である必要があります。

フルスクリーンのアプリケーションでは色変換を行えません。

ウィンドウモードでは D3DFMT_UNKNOWN を指定できます。

bWindowedBOOLinデバイスタイプをフルスクリーンモードで使用するか、ウィンドウモードで使用するかを示す値。TRUE に設定すると、ウィンドウモードのアプリケーションを対象としてクエリが行われます。それ以外の場合は FALSE を設定します。

戻り値

型: HRESULT

このアダプターでデバイスを使用できる場合は D3D_OK が返されます。

Adapter がシステム内のディスプレイアダプター数以上の場合は D3DERR_INVALIDCALL が返されます。また、CheckDeviceType に存在しないデバイスが指定された場合も D3DERR_INVALIDCALL が返されます。

要求されたバックバッファーフォーマットがサポートされていない場合、または指定されたフォーマットに対してハードウェアアクセラレーションが利用できない場合は D3DERR_NOTAVAILABLE が返されます。

解説(Remarks)

hal デバイスタイプにはハードウェアアクセラレーションが必要です。アプリケーションは CheckDeviceType を使用して、hal デバイスをサポートするために必要なハードウェアとドライバーが存在するかどうかを判定できます。

フルスクリーンのアプリケーションでは、アルファチャネルを含む DisplayFormat を指定してはいけません。指定すると呼び出しが失敗します。バックバッファーにアルファチャネルが存在するのは問題ありませんが、2 つのディスプレイフォーマットはそれ以外のすべての点で同一である必要があります。たとえば DisplayFormat = D3DFMT_X1R5G5B5 の場合、BackBufferFormat の有効な値には D3DFMT_X1R5G5B5D3DFMT_A1R5G5B5 が含まれますが、D3DFMT_R5G6B5 は含まれません。

次のコード断片は、あるデバイスタイプをこのアダプターで使用できるかどうかを CheckDeviceType でテストする方法を示しています。


if(SUCCEEDED(pD3Device->CheckDeviceType(D3DADAPTER_DEFAULT, 
                                        D3DDEVTYPE_HAL, 
                                        DisplayFormat, 
                                        BackBufferFormat, 
                                        bIsWindowed)))
    
     return S_OK;
// There is no HAL on this adapter using this render-target format. 
// Try again, using another format.

このコードは、指定したサーフェスフォーマットで既定のアダプター上においてデバイスを使用できる場合に S_OK を返します。

CheckDeviceType を使用して、ディスプレイフォーマットと異なるバックバッファーとの互換性をテストすると、適切な値が返されます。つまり、呼び出しの結果はデバイスの能力を反映します。デバイスが要求されたバックバッファーフォーマットへレンダリングできない場合、呼び出しは D3DERR_NOTAVAILABLE を返します。デバイスがそのフォーマットへレンダリングできても、色変換を伴うプレゼンテーションを実行できない場合も、戻り値は D3DERR_NOTAVAILABLE になります。プレゼンテーション自体のハードウェアサポートは、CheckDeviceFormatConversion を呼び出すことで確認できます。色変換を伴うプレゼンテーション自体のソフトウェアエミュレーションは提供されません。

vtbl 10 HRESULT CheckDeviceFormat(DWORD Adapter, D3DDEVTYPE DeviceType, D3DFORMAT AdapterFormat, DWORD Usage, D3DRESOURCETYPE RType, D3DFORMAT CheckFormat)

IDirect3D9::CheckDeviceFormat メソッド (d3d9helper.h) は、あるサーフェスフォーマットが指定したリソースタイプとして利用可能かどうかを判定します。

AdapterDWORDin問い合わせるディスプレイアダプターを示す序数。D3DADAPTER_DEFAULT は常にプライマリディスプレイアダプターを表します。この値がシステム内のディスプレイアダプター数以上の場合、このメソッドは D3DERR_INVALIDCALL を返します。
DeviceTypeD3DDEVTYPEinデバイスタイプを示す D3DDEVTYPE 列挙型のメンバー。
AdapterFormatD3DFORMATinアダプターが設定されるディスプレイモードのフォーマットを示す D3DFORMAT 列挙型のメンバー。
UsageDWORDinサーフェスに要求する使用法オプション。使用法オプションは D3DUSAGE および D3DUSAGE_QUERY 定数の任意の組み合わせです (CheckDeviceFormat で有効なのは D3DUSAGE 定数の一部のみです。D3DUSAGE のページの表を参照してください)。
RTypeD3DRESOURCETYPEin問い合わせるフォーマットと組み合わせて使用するリソースタイプ。D3DRESOURCETYPE のメンバー。
CheckFormatD3DFORMATinUsage で定義される用途で使用される可能性のあるサーフェスのフォーマット。D3DFORMAT のメンバー。

戻り値

型: HRESULT

要求された用途において、指定したデバイスとフォーマットに互換性がある場合、このメソッドは D3D_OK を返します。

Adapter がシステム内のディスプレイアダプター数以上の場合、または DeviceType がサポートされていない場合は D3DERR_INVALIDCALL が返されます。

この用途においてデバイスがそのフォーマットを受け付けない場合は D3DERR_NOTAVAILABLE が返されます。

解説(Remarks)

CheckDeviceFormat を使用してハードウェアサポートを確認する例をいくつか示します。

Direct3D 9 から Direct3D 10 へコードを移行する場合、CheckDeviceFormat に相当する Direct3D 10 の機能は CheckFormatSupport です。
vtbl 11 HRESULT CheckDeviceMultiSampleType(DWORD Adapter, D3DDEVTYPE DeviceType, D3DFORMAT SurfaceFormat, BOOL Windowed, D3DMULTISAMPLE_TYPE MultiSampleType, DWORD* pQualityLevels)

IDirect3D9::CheckDeviceMultiSampleType メソッド (d3d9.h) は、あるマルチサンプリング手法がこのデバイスで利用可能かどうかを判定します。

AdapterDWORDin問い合わせるディスプレイアダプターを示す序数。D3DADAPTER_DEFAULT は常にプライマリディスプレイアダプターを表します。この値がシステム内のディスプレイアダプター数以上の場合、このメソッドは FALSE を返します。「解説」を参照してください。
DeviceTypeD3DDEVTYPEinデバイスタイプを示す D3DDEVTYPE 列挙型のメンバー。
SurfaceFormatD3DFORMATinマルチサンプリングするサーフェスのフォーマットを指定する D3DFORMAT 列挙型のメンバー。詳細については「解説」を参照してください。
WindowedBOOLinbool 値。ウィンドウモードのマルチサンプリングについて問い合わせる場合は TRUE を、フルスクリーンのマルチサンプリングについて問い合わせる場合は FALSE を指定します。
MultiSampleTypeD3DMULTISAMPLE_TYPEinテストするマルチサンプリング手法を示す D3DMULTISAMPLE_TYPE 列挙型のメンバー。
pQualityLevelsDWORD*inoutpQualityLevels には、指定したサンプルタイプで利用可能なデバイス固有のサンプリングバリエーションの数が返されます。たとえば、返される値が 3 の場合、そのサンプル数でリソースを作成するときに品質レベル 0、1、2 を使用できます。これらの品質レベルの意味はデバイスの製造元が定義するものであり、D3D から問い合わせることはできません。たとえば、あるデバイスでは、固定のサンプル数における異なる品質レベルが、サンプル位置の空間配置の違いや解決方法の違いを表すことがあります。品質レベルを取得する必要がない場合は NULL を指定できます。

戻り値

型: HRESULT

デバイスが指定されたマルチサンプリング方式を実行できる場合、このメソッドは D3D_OK を返します。 Adapter または MultiSampleType パラメーターが無効な場合は D3DERR_INVALIDCALL が返されます。問い合わせたマルチサンプリング手法がこのデバイスでサポートされていない場合は D3DERR_NOTAVAILABLE を返します。DeviceType がこのアダプターに適用できない場合は D3DERR_INVALIDDEVICE が返されます。

解説(Remarks)

レンダーターゲットサーフェスと深度ステンシルサーフェスを組み合わせて使用する場合は両方をマルチサンプル対応で作成する必要があるため、このメソッドはその両方に対して使用することを想定しています。

次のコード断片は、特定のマルチサンプリング方式をサポートするデバイスを CheckDeviceMultiSampleType でテストする方法を示しています。


if( SUCCEEDED(pD3D->CheckDeviceMultiSampleType( pCaps->AdapterOrdinal, 
                                pCaps->DeviceType, BackBufferFormat, 
                                FALSE, D3DMULTISAMPLE_3_SAMPLES, NULL ) ) &&
         SUCCEEDED(pD3D->CheckDeviceMultiSampleType( pCaps->AdapterOrdinal, 
                                pCaps->DeviceType, DepthBufferFormat, 
                                FALSE, D3DMULTISAMPLE_3_SAMPLES, NULL ) ) )
    return S_OK;

上記のコードは、指定したサーフェスフォーマットでフルスクリーンの D3DMULTISAMPLE_3_SAMPLES マルチサンプリング方式をデバイスがサポートしている場合に S_OK を返します。

マルチサンプルタイプと品質レベルの取り扱いや設定に関する追加情報については、D3DMULTISAMPLE_TYPE の解説を参照してください。

vtbl 12 HRESULT CheckDepthStencilMatch(DWORD Adapter, D3DDEVTYPE DeviceType, D3DFORMAT AdapterFormat, D3DFORMAT RenderTargetFormat, D3DFORMAT DepthStencilFormat)

IDirect3D9::CheckDepthStencilMatch メソッド (d3d9helper.h) は、特定のディスプレイモードにおいて、深度ステンシルフォーマットがレンダーターゲットフォーマットと互換性があるかどうかを判定します。

AdapterDWORDin問い合わせるディスプレイアダプターを示す序数。D3DADAPTER_DEFAULT は常にプライマリディスプレイアダプターを表します。
DeviceTypeD3DDEVTYPEinデバイスタイプを示す D3DDEVTYPE 列挙型のメンバー。
AdapterFormatD3DFORMATinアダプターが設定されるディスプレイモードのフォーマットを示す D3DFORMAT 列挙型のメンバー。
RenderTargetFormatD3DFORMATinテストするレンダーターゲットサーフェスのフォーマットを示す D3DFORMAT 列挙型のメンバー。
DepthStencilFormatD3DFORMATinテストする深度ステンシルサーフェスのフォーマットを示す D3DFORMAT 列挙型のメンバー。

戻り値

型: HRESULT

そのディスプレイモードにおいて深度ステンシルフォーマットがレンダーターゲットフォーマットと互換性がある場合、このメソッドは D3D_OK を返します。1 つ以上のパラメーターが無効な場合は D3DERR_INVALIDCALL が返されることがあります。そのディスプレイモードにおいて深度ステンシルフォーマットがレンダーターゲットと互換性がない場合、このメソッドは D3DERR_NOTAVAILABLE を返します。

解説(Remarks)

このメソッドは、特定の深度フォーマットが特定のレンダーターゲットフォーマットとのみ組み合わせて動作するようなハードウェアに、アプリケーションが対応できるようにするために提供されています。

このメソッドの動作は DirectX 8.1 で変更されました。現在は D24x8 および D32 の深度ステンシルフォーマットも考慮されます。以前のバージョンでは、これらのフォーマットは 32 ビットまたは 16 ビットのレンダーターゲットと常に併用できるものと想定していました。現在は、デバイスが混在深度の処理に対応している場合にのみ、これらのフォーマットに対して D3D_OK を返します。

次のコード断片は、CheckDeviceFormat を使用して深度ステンシルフォーマットを検証する方法を示しています。


BOOL IsDepthFormatOk(D3DFORMAT DepthFormat, 
                          D3DFORMAT AdapterFormat, 
                          D3DFORMAT BackBufferFormat)
{
    
    // Verify that the depth format exists
    HRESULT hr = pD3D->CheckDeviceFormat(D3DADAPTER_DEFAULT,
                                         D3DDEVTYPE_HAL,
                                         AdapterFormat,
                                         D3DUSAGE_DEPTHSTENCIL,
                                         D3DRTYPE_SURFACE,
                                         DepthFormat);
    
    if(FAILED(hr)) return FALSE;
    
    // Verify that the depth format is compatible
    hr = pD3D->CheckDepthStencilMatch(D3DADAPTER_DEFAULT,
                                      D3DDEVTYPE_HAL,
                                      AdapterFormat,
                                      BackBufferFormat,
                                      DepthFormat);
    
    return SUCCEEDED(hr);
    
}

上記の呼び出しは、DepthFormat を AdapterFormat および BackBufferFormat と組み合わせて使用できない場合に FALSE を返します。

vtbl 13 HRESULT CheckDeviceFormatConversion(DWORD Adapter, D3DDEVTYPE DeviceType, D3DFORMAT SourceFormat, D3DFORMAT TargetFormat)

IDirect3D9::CheckDeviceFormatConversion メソッド (d3d9helper.h) は、あるディスプレイフォーマットから別のディスプレイフォーマットへの変換をデバイスがサポートしているかどうかをテストします。

AdapterDWORDinディスプレイアダプターの序数。D3DADAPTER_DEFAULT は常にプライマリディスプレイアダプターを表します。この値がシステム内のディスプレイアダプター数以上の場合、このメソッドは D3DERR_INVALIDCALL を返します。
DeviceTypeD3DDEVTYPEinデバイスタイプ。D3DDEVTYPE 列挙型のメンバー。
SourceFormatD3DFORMATin変換元のアダプターフォーマット。D3DFORMAT 列挙型のメンバー。
TargetFormatD3DFORMATin変換先のアダプターフォーマット。D3DFORMAT 列挙型のメンバー。

戻り値

型: HRESULT

メソッドが成功した場合、戻り値は D3D_OK です。失敗した場合、戻り値は D3DERR_INVALIDCALL です。 2 つのフォーマット間の変換をハードウェアがサポートしていない場合、このメソッドは D3DERR_NOTAVAILABLE を返します。

解説(Remarks)

CheckDeviceType を使用して、ディスプレイフォーマットと異なるバックバッファーとの互換性をテストすると、適切な値が返されます。つまり、呼び出しの結果はデバイスの能力を反映します。デバイスが要求されたバックバッファーフォーマットへレンダリングできない場合、呼び出しは D3DERR_NOTAVAILABLE を返します。デバイスがそのフォーマットへレンダリングできても、色変換を伴うプレゼンテーションを実行できない場合も、戻り値は D3DERR_NOTAVAILABLE になります。プレゼンテーション自体のハードウェアサポートは、CheckDeviceFormatConversion を呼び出すことで確認できます。色変換を伴うプレゼンテーション自体のソフトウェアエミュレーションは提供されません。

CheckDeviceFormatConversion は、StretchRect の呼び出しで許可される、変換元サーフェスフォーマットと変換先サーフェスフォーマットの組み合わせを判定するためにも使用できます。

色変換は、次の変換元および変換先フォーマットに限定されます。

vtbl 14 HRESULT GetDeviceCaps(DWORD Adapter, D3DDEVTYPE DeviceType, D3DCAPS9* pCaps)

IDirect3D9::GetDeviceCaps メソッド (d3d9.h) は、デバイス固有の情報を取得します。

AdapterDWORDinディスプレイアダプターを示す序数。D3DADAPTER_DEFAULT は常にプライマリディスプレイアダプターを表します。
DeviceTypeD3DDEVTYPEinD3DDEVTYPE 列挙型のメンバー。デバイスタイプを示します。
pCapsD3DCAPS9*inoutデバイスの能力を説明する情報が格納される D3DCAPS9 構造体へのポインター。

戻り値

型: HRESULT

メソッドが成功した場合、戻り値は D3D_OK です。失敗した場合、戻り値は次のいずれかになります: D3DERR_INVALIDCALL、D3DERR_INVALIDDEVICE、D3DERR_OUTOFVIDEOMEMORY、D3DERR_NOTAVAILABLE。

解説(Remarks)

アプリケーションは、頂点処理能力が Direct3D デバイスオブジェクト間で一貫して保たれると想定してはいけません。物理デバイスが公開する具体的な能力は、CreateDevice に渡すパラメーターに依存する場合があります。たとえば、ハードウェア頂点処理を有効にして Direct3D デバイスオブジェクトを作成する前と後とで、頂点処理能力が異なることがあります。詳細については D3DCAPS9 の説明を参照してください。

vtbl 15 HMONITOR GetAdapterMonitor(DWORD Adapter)

IDirect3D9::GetAdapterMonitor メソッド (d3d9.h) は、Direct3D オブジェクトに関連付けられたモニターのハンドルを返します。

AdapterDWORDinディスプレイアダプターを示す序数。D3DADAPTER_DEFAULT は常にプライマリディスプレイアダプターを表します。

戻り値

型: HMONITOR

Direct3D オブジェクトに関連付けられたモニターのハンドル。

解説(Remarks)

次のコード断片は、指定したデバイスに関連付けられたモニターのハンドルを取得する方法を示しています。GetDirect3D を使用してデバイスから Direct3D 列挙子を取得し、GetCreationParameters を使用して Adapter の値を取得します。


    if( FAILED( pDevice->GetCreationParameters(  &Parameters ) ) )
        return D3DERR_INVALIDCALL;
    
    if( FAILED( pDevice->GetDirect3D(&pD3D) ) )
        return D3DERR_INVALIDCALL;
    
    hMonitor = pD3D->GetAdapterMonitor(Parameters.AdapterOrdinal);
    
    pD3D->Release();
vtbl 16 HRESULT CreateDevice(DWORD Adapter, D3DDEVTYPE DeviceType, HWND hFocusWindow, DWORD BehaviorFlags, D3DPRESENT_PARAMETERS* pPresentationParameters, IDirect3DDevice9** ppReturnedDeviceInterface)

IDirect3D9::CreateDevice メソッド (d3d9.h) は、ディスプレイアダプターを表すデバイスを作成します。

AdapterDWORDinディスプレイアダプターを示す序数。D3DADAPTER_DEFAULT は常にプライマリディスプレイアダプターを表します。
DeviceTypeD3DDEVTYPEin必要とするデバイスタイプを示す D3DDEVTYPE 列挙型のメンバー。必要とするデバイスタイプが利用できない場合、このメソッドは失敗します。
hFocusWindowHWNDin

フォーカスウィンドウは、アプリケーションがフォアグラウンドモードからバックグラウンドモードへ切り替わったことを Direct3D に通知します。「解説」を参照してください。

  • フルスクリーンモードでは、指定するウィンドウはトップレベルウィンドウである必要があります。
  • ウィンドウモードでは、pPresentationParameters の hDeviceWindow メンバーに有効な非 NULL の値が設定されている場合に限り、このパラメーターを NULL にできます。
BehaviorFlagsDWORDinデバイスの作成を制御する 1 つ以上のオプションの組み合わせ。詳細については D3DCREATE を参照してください。
pPresentationParametersD3DPRESENT_PARAMETERS*inout

作成するデバイスのプレゼンテーションパラメーターを記述した D3DPRESENT_PARAMETERS 構造体へのポインター。BehaviorFlags に D3DCREATE_ADAPTERGROUP_DEVICE を指定した場合、pPresentationParameters は配列になります。ヘッドの数にかかわらず、自動的に作成される深度/ステンシルサーフェスは 1 つだけです。

Windows 2000 および Windows XP では、フルスクリーンデバイスのディスプレイリフレッシュレートは次の順序で設定されます。

  1. デバイスがサポートしている場合、ユーザーが指定した 0 以外の ForcedRefreshRate レジストリキーの値。
  2. プレゼンテーションパラメーターでアプリケーションが指定した 0 以外のリフレッシュレート値。
  3. デバイスがサポートしている場合、直近のデスクトップのリフレッシュレート。
  4. デバイスがサポートしている場合、75 ヘルツ。
  5. デバイスがサポートしている場合、60 ヘルツ。
  6. デバイスの既定値。
サポートされていないリフレッシュレートは、それより下で最も近いサポート対象のリフレッシュレートになります。たとえば、アプリケーションが 63 ヘルツを指定した場合は 60 ヘルツが使用されます。57 ヘルツ未満のリフレッシュレートはサポートされていません。

pPresentationParameters は入力パラメーターであると同時に出力パラメーターでもあります。このメソッドを呼び出すと、次のようないくつかのメンバーが変更される場合があります。

  • メソッド呼び出し前に BackBufferCount、BackBufferWidth、BackBufferHeight が 0 の場合、メソッドが返るときに変更されます。
  • メソッド呼び出し前に BackBufferFormat が D3DFMT_UNKNOWN の場合、メソッドが返るときに変更されます。
ppReturnedDeviceInterfaceIDirect3DDevice9**out作成されたデバイスを表す IDirect3DDevice9 インターフェイスへのポインターを受け取るアドレス。

戻り値

型: HRESULT

メソッドが成功した場合、戻り値は D3D_OK です。失敗した場合、戻り値は次のいずれかになります: D3DERR_DEVICELOST、D3DERR_INVALIDCALL、D3DERR_NOTAVAILABLE、D3DERR_OUTOFVIDEOMEMORY。

解説(Remarks)

このメソッドは、必要なディスプレイモード (またはウィンドウモード) に設定され、適切なバックバッファーが割り当てられた、完全に動作するデバイスインターフェイスを返します。レンダリングを開始するには、アプリケーションは深度バッファーを作成して設定するだけで済みます (D3DPRESENT_PARAMETERS の EnableAutoDepthStencil が FALSE の場合)。

Direct3D デバイスを作成するときは、フォーカスウィンドウ (hFocusWindow) とデバイスウィンドウ (D3DPRESENT_PARAMETERS の hDeviceWindow) という 2 つの異なるウィンドウパラメーターを指定します。それぞれの目的は次のとおりです。

このメソッドを WM_CREATE の処理中に実行してはいけません。アプリケーションは WM_CREATE の処理中に Direct3D へウィンドウハンドルを渡してはいけません。
デバイスの作成、解放、リセットの呼び出しは、いずれもフォーカスウィンドウのウィンドウプロシージャと同じスレッドから行う必要があります。

なお、D3DCREATE_HARDWARE_VERTEXPROCESSINGD3DCREATE_MIXED_VERTEXPROCESSINGD3DCREATE_SOFTWARE_VERTEXPROCESSING は相互排他的なフラグであり、このメソッドを呼び出す際にはこれらの頂点処理フラグの少なくとも 1 つを指定する必要があります。

デバイスの一部として作成されるバックバッファーは、プレゼンテーションパラメーターで D3DPRESENTFLAG_LOCKABLE_BACKBUFFER が指定されている場合にのみロック可能です (マルチサンプリングされたバックバッファーおよび深度サーフェスは決してロックできません)。

ResetIUnknownTestCooperativeLevel の各メソッドは、このメソッドでデバイスを作成したスレッドと同じスレッドから呼び出す必要があります。

CreateDeviceResetCreateAdditionalSwapChain を呼び出す際、ウィンドウモードのバックバッファーフォーマットには D3DFMT_UNKNOWN を指定できます。これにより、ウィンドウモードで CreateDevice を呼び出す前に、アプリケーションが現在のデスクトップフォーマットを問い合わせる必要がなくなります。フルスクリーンモードでは、バックバッファーフォーマットを指定する必要があります。

サイズが 0x0 のウィンドウでデバイスを作成しようとすると、CreateDevice は失敗します。

出典・ライセンス: 上記「公式ドキュメント」の内容は Microsoft の Win32 API ドキュメント(MicrosoftDocs/sdk-api)を日本語に翻訳・改変したものです。© Microsoft Corporation. CC BY 4.0 で提供。
Microsoft 公式リファレンス: 英語 (en-us) · 日本語 (ja-jp) · 原文ソース (GitHub)

HSP用 COM定義

#usecom / #comfunc によるHSPのCOM呼び出し定義。数字は vtbl インデックス(0始まり)。クラスIDが無い場合 #usecom の末尾は "{}"、ある場合は "{CLSID}"

出力引数:
#define global IID_IDirect3D9 "{81BDCBCA-64D4-426D-AE8D-AD0147F4275C}"
#usecom global IDirect3D9 IID_IDirect3D9 "{}"
#comfunc global IDirect3D9_RegisterSoftwareDevice       3 sptr
#comfunc global IDirect3D9_GetAdapterCount              4
#comfunc global IDirect3D9_GetAdapterIdentifier         5 int,int,var
#comfunc global IDirect3D9_GetAdapterModeCount          6 int,int
#comfunc global IDirect3D9_EnumAdapterModes             7 int,int,int,var
#comfunc global IDirect3D9_GetAdapterDisplayMode        8 int,var
#comfunc global IDirect3D9_CheckDeviceType              9 int,int,int,int,int
#comfunc global IDirect3D9_CheckDeviceFormat            10 int,int,int,int,int,int
#comfunc global IDirect3D9_CheckDeviceMultiSampleType   11 int,int,int,int,int,var
#comfunc global IDirect3D9_CheckDepthStencilMatch       12 int,int,int,int,int
#comfunc global IDirect3D9_CheckDeviceFormatConversion  13 int,int,int,int
#comfunc global IDirect3D9_GetDeviceCaps                14 int,int,var
#comfunc global IDirect3D9_GetAdapterMonitor            15 int
#comfunc global IDirect3D9_CreateDevice                 16 int,int,sptr,int,var,sptr
; ※数字は vtbl インデックス(0始まり)。0/1/2 は IUnknown(QueryInterface/AddRef/Release)。
; ※このインターフェースは直接 CoCreateInstance するクラスIDが無いため "{}"(他メソッド/アクティベーションで取得)。
; ※出力/バッファ引数は var(変数直渡し)。varptr 方式にも切替可。
; ※ハンドル/void*等の不透明ポインタは IronHSP では intptr 指定が可能。