Direct3D 9 への変換

Microsoft Direct3D 9 では、次の機能が変更されました。 これらの機能を使用している場合は、アプリケーションを Direct3D 9 に移植するのに役立つ以下の変更を参照してください。

BaseVertexIndex の変更

DirectX 8.x では、IDirect3DDevice8::SetIndices では、インデックス バッファーへのポインターと、頂点バッファー内の開始位置に BaseVertexIndex が必要でした。 さまざまなオブジェクトを頂点バッファーにバッチ処理するアプリケーションでは、IDirect3DDevice8::D rawIndexedPrimitive を呼び出す前に、インデックス バッファーを切り替える (または IDirect3DDevice8::SetIndices を呼び出す) 必要がありました。

Direct3D 9 では、頂点バッファー BaseVertexIndex の開始位置が IDirect3DDevice9::D rawIndexedPrimitive に移動され、そのデータ型が DWORD から INT に変更されました。

HRESULT IDirect3DDevice9::DrawIndexedPrimitive( 
    D3DPRIMITIVETYPE PrimType, 
    INT BaseVertexIndex, 
    UINT minIndex, 
    UINT NumVertices, 
    UINT startIndex, 
    UINT primCount); 

HRESULT SetIndices(IDirect3DIndexBuffer9* pIndexData); 

CreateImageSurface の変更

IDirect3DDevice8::CreateImageSurface の名前が CreateOffscreenPlainSurface に変更されました。 D3DPOOL 型を受け取る追加のパラメーターが追加されました。 D3DPOOL_SCRATCHは、IDirect3DDevice8::CreateImageSurface によって作成されたサーフェスと同じ特性を持つサーフェスを返します。 D3DPOOL_DEFAULTは、 StretchRectColorFill で使用するための適切なプールです。

D3DENUM_NO_WHQL_LEVELの変更

応答に比較的長い (数秒) かかるため、アプリケーションで Microsoft Windows Hardware Quality Labs (WHQL) を明示的に要求する必要があります。 D3DENUM_NO_WHQL_LEVELが削除され、D3DENUM_WHQL_LEVELが追加されました。

リソースの変更を作成する

ハンドルは複数のメソッドに追加されており、 NULL に設定する必要があります。 影響を受けるメソッドは次のとおりです。

EnumAdapterModes の変更

EnumAdapterModes は D3DFORMAT を受け取るようになりました。

HRESULT IDirect3D9::EnumAdapterModes( 
       UINT Adapter, 
       D3DFORMAT Format, 
       UINT Mode, 
       D3DDISPLAYMODE *pMode); 

この形式では、拡張された一連の表示モードがサポートされています。 アプリケーションの出荷時に発明されなかった形式を列挙からアプリケーションを保護するには、列挙する必要がある表示モードの形式を Direct3D に通知する必要があります。 結果として得られる表示モードの配列は、幅、高さ、更新レートによってのみ異なります。

アプリケーションはピクセル形式を指定し、列挙は形式と完全に一致する表示モードに制限されます。 許可される形式の一覧を次に示します。

  • D3DFMT_A1R5G5B5
  • D3DFMT_A2B10G10R10
  • D3DFMT_A8R8G8B8
  • D3DFMT_R5G6B5
  • D3DFMT_X1R5G5B5
  • D3DFMT_X8R8G8B8

列挙型は、同じ形式のアルファ バージョンと非アルファ バージョンに相当します。 返される Format は、常にアプリケーションによって提供されるのと同じ形式で入力されます。

このメソッドは、565 と 555 を同等のものとして扱い、Format で正しいバージョンを返します。 この違いは、アプリケーションがバック バッファーをロックし、これを実現するためにアプリケーションが設定する必要がある明示的なフラグがある場合にのみ発生します。

Get/SetStreamSource の変更

GetStreamSource メソッドと SetStreamSource メソッドに 1 つのパラメーターが追加されました。 オフセットは、ストリームの先頭から頂点データの先頭までのバイト数です。 バイト数で示します。 これにより、パイプラインでストリーム オフセットをサポートできます。 デバイスがストリーム オフセットをサポートしているかどうかを確認するには、「D3DDEVCAPS2_STREAMOFFSET」を参照してください。

HRESULT GetStreamSource(
    UINT StreamNumber,
    IDirect3DVertexBuffer9 **ppStreamData,
    UINT *pOffsetInBytes,
    UINT *pStride);

マルチサンプリング品質の変更

以前は、D3DMULTISAMPLE_TYPE列挙しかありませんでした。 Direct3D 9 は、この列挙を保持し、列挙体の各要素の品質レベルの概念を追加します。 品質レベルは、マスク可能なサンプルの数 (D3DRS_MULTISAMPLEMASKの意味) を示すことによって、ビジュアルの品質とパフォーマンスのトレードオフを示します。

アプリケーションでは、必要なマスク可能なサンプルの数を選択し、pQualityLevels を参照する必要があります。 0 以外の場合、この値は、アプリケーションが MultiSampleQuality を介してさまざまな作成関数に渡すことができる品質レベルの数を示します。 ドライバーは、すべてのマルチサンプル スキームを品質レベルとしてD3DMULTISAMPLE_NONMASKABLEで公開するため、アプリケーションでサンプルをマスクする必要がない場合は、この 1 つの種類を通じて使用可能なすべてのマルチサンプリング スキームを列挙できます。

D3DPRASTERCAPS_STRETCHBLTMULTISAMPLE キャップ ビットは廃止されました。 このビットは、マルチサンプリング メソッドが書き込みマスクをサポートしておらず、 BeginSceneEndScene の間でオンとオフを切り替えられなかったことを意味するために使用されました。 このようなマスクできないメソッドは、D3DMULTISAMPLE_NONMASKABLEを介して公開されるようになりました。

HRESULT CheckDeviceMultiSampleType( 
       UINT Adapter, 
       D3DDEVTYPE DeviceType, 
       D3DFORMAT SurfaceFormat, 
       BOOL Windowed, 
       D3DMULTISAMPLE_TYPE MultiSampleType, 
       DWORD * pQualityLevels); 

マスク可能なサンプルの数ごとに異なる最大値があります。 たとえば、D3DMULTISAMPLE_4_SAMPLESには 3 つのレベルの品質が含まれますが、D3DMULTISAMPLE_2_SAMPLESには 1 つしかない場合があります。 マスク可能なサンプルの数ごとに、最大 8 レベルの品質があります (ドライバーはより多くを表現することはできません)。 品質の範囲は 0 から (*pQualityLevels - 1)。

ResourceManagerDiscardBytes の変更

ResourceManagerDiscardBytes は IDirect3DDevice9::EvictManagedResources に置き換えられました。 Direct3D とドライバーの両方のリソースを削除できます。

リソース マネージャーは、ビデオ メモリが不足しているためにリソース (マネージドか非管理かに関係なく) の作成が失敗したときに参照されるようになりました。 マネージャーは、作成を成功させるために十分なリソースを解放するように自動的に求められます。 DirectX 8.0 では、これは自動化されたプロセスではありません。

SetSoftwareVertexProcessing の変更

アプリケーションは、ソフトウェアとハードウェアの頂点処理を使用する混合モード デバイスを作成できます。

DirectX 8.x で 2 つの頂点処理モードを切り替えるには、IDirect3DDevice8::SetRenderState を呼び出します。 これは、状態ブロックによって発生する問題を容易にするために 、SetSoftwareVertexProcessing に置き換えられました。 この新しいメソッドは、状態ブロックによって記録されません。

テクスチャ サンプラーの変更

Direct3D 9 は、ピクセル シェーダー 2_0 モデルを使用して、1 パスで最大 16 個のテクスチャ サーフェスをサポートします。ただし、テクスチャ座標の数は 8 に制限されたままです。 テクスチャ ステージの状態は、サーフェス、座標セット、頂点処理、ピクセル処理に関連付けられます。 コンパイル時にこれらの違いを管理するために、 SetTextureStageState は次の 2 つのメソッドに分かれています。

  • IDirect3DDevice9::SetTextureStageState は、ラップ モードやテクスチャ座標の生成など、テクスチャ座標の状態に引き続き使用されます。
  • SetSamplerState が追加され、フィルター処理、タイリング、クランプ、MIPLOD などに使用されるようになります。 これは、最大 16 個のサンプラーで機能します。

SetTextureStageState の変更

IDirect3DDevice9::SetTextureStageState によって次の状態が設定されるようになりました。

  • 関数の頂点処理の状態を修正しました。 この状態は、テクスチャ座標のD3DTSS_TEXTURETRANSFORMFLAGSとD3DTSS_TEXCOORDINDEXの操作を制御します。 それぞれ最大 8 個まで設定できます (8 つのテクスチャ座標が常にサポートされているため)。 D3DTSS_TEXCOORDINDEXは、固定関数の頂点処理状態です。 プログラム可能な頂点シェーダーを使用する場合、この状態は無視されます。

  • 関数ピクセル シェーダーの状態 (従来の TextureStageState) を修正しました。

    • D3DTSS_ALPHAARG0
    • D3DTSS_ALPHAARG1
    • D3DTSS_ALPHAARG2
    • D3DTSS_ALPHAOP
    • D3DTSS_BUMPENVLOFFSET
    • D3DTSS_BUMPENVLSCALE
    • D3DTSS_BUMPENVMAT00
    • D3DTSS_BUMPENVMAT01
    • D3DTSS_BUMPENVMAT10
    • D3DTSS_BUMPENVMAT11
    • D3DTSS_COLORARG0
    • D3DTSS_COLORARG1
    • D3DTSS_COLORARG2
    • D3DTSS_COLOROP
    • D3DTSS_RESULTARG

    設定できる固定関数ピクセル シェーダーの状態の数は、MaxTextureBlendStages で表される数以下です。

アプリケーションで使用できるテクスチャ サンプラーの数は、次の表に示すように、ピクセル シェーダーのバージョンによって決まります。

名前 number
ps_1_3にps_1_1する 4 つのテクスチャ サンプラー
ps_1_4 6 つのテクスチャ サンプラー
ps_2_0 16 個のテクスチャ サンプラー
固定関数パイプライン MaxTextureBlendStages/MaxSimultaneousTextures テクスチャ サンプラー

 

Direct3D 9 でディスプレイスメント マッピングをサポートするデバイスでは、テセレータ ユニット内のディスプレイスメント マップをサンプリングする追加サンプラー (D3DDMAPSAMPLER) がサポートされます。

SetSamplerState の変更

IDirect3DDevice9::SetSamplerState は、サンプラーの状態を設定します (テセレータ ユニットで使用される状態を含めて、ディスプレイスメント マップをサンプリングします)。 これらは、DirectX 8.x からの移植時のコンパイル時エラー検出を有効にするために、D3DSAMP_ プレフィックスで名前が変更されました。 状態は次のとおりです。

  • D3DSAMP_ADDRESSU
  • D3DSAMP_ADDRESSV
  • D3DSAMP_ADDRESSW
  • D3DSAMP_BORDERCOLOR
  • D3DSAMP_MAGFILTER
  • D3DSAMP_MAXANISOTROPY
  • D3DSAMP_MAXMIPLEVEL
  • D3DSAMP_MINFILTER
  • D3DSAMP_MIPFILTER
  • D3DSAMP_MIPMAPLODBIAS

頂点宣言の変更

頂点宣言が頂点シェーダーの作成から切り離されるようになりました。 頂点宣言でコンポーネント オブジェクト モデル (COM) インターフェイスが使用されるようになりました。

DirectX 8.x の場合、頂点宣言は頂点シェーダーに関連付けられます。

  • 固定関数パイプラインの場合は、頂点バッファーのフレキシブル頂点形式 (FVF) コードを使用して SetVertexShader を呼び出します。
  • 頂点シェーダーの場合は、以前に作成した頂点シェーダーへのハンドルを使用して IDirect3DDevice9::SetVertexShader を呼び出します。 シェーダーには頂点宣言が含まれています。

Direct3D 9 の場合、頂点宣言は頂点シェーダーから切り離され、固定関数パイプラインまたはシェーダーで使用できます。

  • 固定関数パイプラインでは、IDirect3DDevice9::SetVertexShader を呼び出す必要はありません。 ただし、固定関数パイプラインに切り替え、以前に頂点シェーダーを使用していた場合は、IDirect3DDevice9::SetVertexShader(NULL) を呼び出します。 これが完了したら、FVF コードを宣言するために SetFVF を呼び出す必要があります。
  • 頂点シェーダーを使用する場合は、頂点シェーダー オブジェクトを使用して IDirect3DDevice9::SetVertexShader を呼び出します。 さらに、IDirect3DDevice9::SetFVF を呼び出して頂点宣言を設定します。 これにより、FVF で暗黙的な情報が使用されます。 SetVertexDeclaration は、FVF では表現できない頂点宣言をサポートしているため、IDirect3DDevice9::SetFVF の代わりに呼び出すことができます。

Intervals と SwapEffects の変更

モニターのリフレッシュレート、プレゼンテーションレート、フロントバッファーとバックバッファー描画をより細かく制御できるように、いくつかの変更が行われました。 制限事項は次のとおりです。

  • 1 つのスワップ効果、D3DSWAPEFFECT_COPY_VSYNC、1 つのプレゼンテーション レート (D3DPRESENT_RATE_UNLIMITED) を削除しました。
  • D3DPRESENT_PARAMETERSの名前を変更しました。PresentationIntervals にFullScreen_PresentationIntervalします。
  • D3DPRESENT_INTERVAL_IMMEDIATE追加されました。これは、プレゼンテーションが垂直同期と同期されていないことを意味します。DirectX 8.x と同様に、D3DPRESENT_INTERVAL_DEFAULTは 0 として定義され、D3DPRESENT_INTERVAL_ONEに相当します。 D3DPRESENT_INTERVAL_DEFAULTは、D3DPRESENT_PARAMETERSを 0 に初期化する便利な方法です。

サポートされているモードと間隔の詳細については、「D3DPRESENT」を参照してください。

Direct3D 9 グラフィックス