次の方法で共有


DirectX 9.0 への移行

DirectX 9.0 への移行

Microsoft® DirectX® 9.0 では次の機能が変更されている。これらの機能を使っているアプリケーションを DirectX 9.0 に移植する場合は、次に示す変更内容を確認すること。

  • BaseVertexIndex の変更
  • CreateImageSurface の変更
  • D3DENUM_NO_WHQL_LEVEL の変更
  • EnumAdapterModes の変更
  • Get/SetStreamSource の変更
  • ハンドル
  • マルチサンプリングの品質の変更
  • ResourceManagerDiscardBytes の変更
  • SetSoftwareVertexProcessing の変更
  • テクスチャ サンプラの変更
  • 頂点宣言の変更
  • Vsync、Interval、SwapEffect の変更

BaseVertexIndex の変更

DirectX 8.x では、SetIndices には、インデックス バッファへのポインタと、頂点バッファの開始位置を示す BaseVertexIndex が必要であった。異なる複数のオブジェクトを頂点バッファにバッチ処理するアプリケーションは、インデックス バッファを切り替えてから (または、SetIndices を呼び出してから) DrawIndexedPrimitive を呼び出さなければならなかった。

DirectX 9.0 では、頂点バッファの開始位置を示す BaseVertexIndexIDirect3DDevice9::DrawIndexedPrimitive に移動している。

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

    HRESULT SetIndices( 
        IDirect3DIndexBuffer9* pIndexData ); 

CreateImageSurface の変更

CreateImageSurfaceIDirect3DDevice9::CreateOffscreenPlainSurface に名前が変更された。パラメータ D3DPOOL が追加された。

HRESULT CreateOffscreenPlainSurface(
    UINT    Width,
    UINT    Height,
    D3DFORMAT Format,
    D3DPOOL Pool,
    IDirect3DSurface9** pReturnedSurfaceInterface);

D3DPOOL_SCRATCH は、以前の CreateImageSurface によって作成されたサーフェイスと同じ特性を持つサーフェイスを返す。

D3DPOOL_DEFAULT は、IDirect3DDevice9::StretchRect および IDirect3DDevice9::ColorFill で使う適切なプールである。

D3DENUM_NO_WHQL_LEVEL の変更

Microsoft Windows® のハードウェア認定レベルの問い合わせは応答に比較的時間がかかるため (数秒間)、アプリケーションがこれを明示的に行わなければならないようになった。D3DENUM_NO_WHQL_LEVEL が削除され、D3DENUM_WHQL_LEVEL が追加された。詳細については、D3DADAPTER_IDENTIFIER9 の「WHQLLevel メンバ」を参照すること。

EnumAdapterModes の変更

IDirect3D9::EnumAdapterModesD3DFORMAT を使えるようになった。

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

この追加フォーマット パラメータはディスプレイ モードの拡張セットをサポートする。アプリケーションの出荷時に考案されていなかった列挙フォーマットが使われることのないように、ディスプレイ モードの列挙に使うフォーマットをアプリケーションが Microsoft Direct3D® に指示する必要がある。結果として得られるディスプレイ モードの配列は、幅、高さ、リフレッシュ レートのみが異なる。

アプリケーションがピクセル フォーマットを指定し、列挙はそのフォーマットに正確に一致するディスプレイ モードだけに限定される。使用できるフォーマットは、D3DFMT_X8R8G8B8、D3DFMT_A8R8G8B8、D3DFMT_A2B10G10R10、D3DFMT_X1R5G5B5、D3DFMT_A1R5G5B5、D3DFMT_R5G6B5 である。

同じフォーマットであれば、アルファ バージョンでも非アルファ バージョンでも列挙は同じである。返される D3DDISPLAYMODE の FORMAT メンバには、アプリケーションで指定した同じフォーマットが常に格納される。

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

Get/SetStreamSource の変更

IDirect3DDevice9::GetStreamSource メソッドと IDirect3DDevice9::SetStreamSource メソッドのパラメータが 1 つ追加された。オフセット パラメータは、ストリーム先頭と頂点データ先頭の間のバイト数である。オフセットはバイト単位で示される。これによって、パイプラインでストリーム オフセットをサポートできる。デバイスがストリーム オフセットをサポートしているかどうかを調べるには、D3DDEVCAPS2 の「D3DDEVCAPS2_STREAMOFFSET 定数」を参照すること。

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

ハンドル

いくつかのメソッドにもう 1 つのパラメータとしてハンドルが追加された。このパラメータは現在は使用されていないので、NULL に設定する必要がある。影響を受けるメソッドは、次のとおりである。

    CreateTexture
    CreateVolumeTexture
    CreateCubeTexture
    CreateVertexBuffer
    CreateIndexBuffer
    CreateRenderTarget
    CreateDepthStencilSurface
    CreateOffscreenPlainSurface

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

以前は、D3DMULTISAMPLE_TYPE 列挙が存在するだけであった。DirectX 9.0 では、この列挙を保持し、列挙の各要素の品質レベルという考え方を導入した。品質レベルは、マスキング可能なサンプル数を (D3DRS_MULTISAMPLEMASK で) 示すことによって、表示品質とパフォーマンスとのトレードオフを示す。

アプリケーションは必要とするマスキング可能なサンプル数を選択し、IDirect3D9::CheckDeviceMultiSampleType が返す pQualityLevels 値を調べる必要がある。この値は、ゼロ以外の場合、アプリケーションが新しい MultiSampleQuality 引数を介してさまざまな作成関数 (CreateRenderTarget など) に渡すことができる品質レベルの数を示す。

ドライバは、D3DMULTISAMPLE_ONE でそのすべてのマルチサンプリング スキームを品質レベルとして公開するので、アプリケーションでサンプルをマスキングする必要がない場合は、この 1 つの型だけで利用可能なすべてのマルチサンプリング スキームを列挙できる。D3DPRASTERCAPS_STRETCHBLTMULTISAMPLE Caps ビットは使われなくなった。このビットは、マルチサンプリング メソッドが書き込みマスクをサポートしていないことを示すために使われていたが、BeginScene と EndScene の間でオンとオフを切り替えることができなかった。このようなマスキング可能ではないメソッドは、D3DMULTISAMPLE_ONE を介して公開されるようになった。

新しい Caps ビットである D3DPRASTERCAPS_MULTISAMPLE_TOGGLABLE は、デバイスが BeginScene と EndScene の間で、D3DRS_MULTISAMPLEANTIALIAS レンダリング ステートを使って、マルチサンプリングのオンとオフの切り替えることができることを示す。このフラグを設定しないデバイスは、BeginScene/EndScene の内部でマルチサンプリングを有効または無効にすることができない。

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

最大値は、マスキング可能なサンプル数ごとに異なる (たとえば、D3DMULTISAMPLE_4_SAMPLES は 3 つの品質レベルを持つことができるが、_2_SAMPLES が持つことができるのは 1 つだけである)。マスキング可能なサンプル数ごとの品質レベル数は 8 つが上限である (ドライバはこれを超えて表現できない)。品質の範囲は 0 ~ (*pQualityLevels-1) である。

IDirect3DDevice9::CreateRenderTarget および IDirect3DDevice9::CreateDepthStencilSurface もまた品質レベルを返すように拡張された。ペアにするメソッドは、品質レベルと DirectX 8.x のマルチサンプリング タイプが一致していなければならない。

ResourceManagerDiscardBytes の変更

ResourceManagerDiscardBytesIDirect3DDevice9::EvictManagedResources に置き換えられた。これを使うと、すべてのリソース、つまり Direct3D リソースとドライバ リソースの両方を消去できる。

ビデオ メモリの不足のためにリソース (管理下にあるかどうかは問わない) の作成に失敗した場合、リソース マネージャに対して問い合わせが行われるようになった。作成が成功するために必要なリソースを解放するように、マネージャに対する要求が自動的に行われる。DirectX 8.0 では、この処理は自動的には行われなかった。

SetSoftwareVertexProcessing の変更

アプリケーションは、ミックス モードのデバイスを作成して、ソフトウェアおよびハードウェアの頂点処理を使える。

DirectX 8.x で 2 つの頂点処理モードを切り替えるには、D3DRS_SOFTWAREVP を使って IDirect3DDevice8::SetRenderState を呼び出す。ステート ブロックによって発生する問題を解消するために、このメソッドは IDirect3DDevice9::SetSoftwareVertexProcessing で置き換えられた。この新しいメソッドはステート ブロックによって記録されない。

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

DirectX 9.0 では、ピクセル シェーダ 2.0 モデルを使って、1 つのパスで最大 16 個のテクスチャ サーフェイスをサポートできるが、テクスチャ座標は 8 個までに制限される。テクスチャ ステージ ステートには、サーフェイスに関連するもの、座標セットに関連するもの、頂点処理に関連するもの、およびピクセル処理に関連するものがある。コンパイル時にこれらの違いを管理するために、テクスチャ ステージ ステート アプリケーション プログラミング インターフェイス (API) を 2 つに分割した。ラップ モードなどのテクスチャ座標ステートやテクスチャ座標生成には、従来の IDirect3DDevice9::SetTextureStageState を使う。さらに、IDirect3DDevice9::SetSamplerState は、フィルタリング、タイリング、クランピング、MIPLOD などに使われる。これは最大 16 個までのサンプラに対して有効である。

SetTextureStageState の変更

現在、SetTextureStageState は次のステートを設定する。

  • 固定機能頂点処理ステート - D3DTSS_TEXTURETRANSFORMFLAGS および D3DTSS_TEXCOORDINDEX。これらのステートはテクスチャ座標の操作を制御する。それぞれ 8 個まで設定できる (常に 8 個のテクスチャ座標がサポートされているため)。
  • 固定機能ピクセル シェーダ ステート (従来の TextureStageState) - D3DTSS_COLOROP、D3DTSS_ALPHAOP、D3DTSS_COLORARG0、D3DTSS_COLORARG1、D3DTSS_COLORARG2、D3DTSS_ALPHAARG0、D3DTSS_ALPHAARG1、D3DTSS_ALPHAARG2、D3DTSS_BUMPENVMAT00、D3DTSS_BUMPENVMAT01、D3DTSS_BUMPENVMAT10、D3DTSS_BUMPENVMAT11、D3DTSS_BUMPENVLSCALE、D3DTSS_BUMPENVLOFFSET、および D3DTSS_RESULTARG。これらは、最大で、MaxTextureBlendStages に指定された数まで設定できる。

D3DTSS_TEXCOORDINDEX。これは固定機能頂点処理ステートである。プログラマブル頂点シェーダが使用されている場合、このステートは無視される。

アプリケーションで使用可能なテクスチャ サンプラの数はピクセル シェーダのバージョンによって決まる。

  • 固定機能ピクセル シェーダ - MaxTextureBlendStages または MaxSimultaneousTextures に指定されている数のテクスチャ サンプラ。
  • ps_1_1 ~ ps_1_3 (4 個のテクスチャ サンプラ)。
  • ps_1_4 (6 個のテクスチャ サンプラ)。
  • ps_2_0 (16 個のテクスチャ サンプラ)。
  • DirectX 9.0 のディスプレースメント マッピングをサポートしているデバイスは、追加のサンプラ (D3DDMAPSAMPLER) もサポートできる。 このサンプラは、テセレーション単位内のディスプレースメント マップをサンプリングする。

SetSamplerState の変更

SetSamplerState はサンプラのステートを設定する (テセレーション単位内でのディスプレースメント マップのサンプリングに使用されるものも含む)。DirectX 8.x から移植するときにコンパイル時エラーを検出できるように、D3DSAMP_ プレフィクスが付く名前に変更されている。これらのステートには、D3DSAMP_ADDRESSU、D3DSAMP_ADDRESSV、D3DSAMP_ADDRESSW、D3DSAMP_BORDERCOLOR、D3DSAMP_MAGFILTER、D3DSAMP_MINFILTER、D3DSAMP_MIPFILTER、D3DSAMP_MIPMAPLODBIAS、D3DSAMP_MAXMIPLEVEL、D3DSAMP_MAXANISOTROPY などがある。

頂点宣言の変更

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

DirectX 8.x では、頂点宣言は頂点シェーダと結合されていた。

  • 固定機能パイプラインの場合は、頂点バッファの柔軟な頂点フォーマット (FVF) コードを使って SetVertexShader を呼び出す。
  • 頂点シェーダの場合は、以前に作成した頂点シェーダへのハンドルを使って SetVertexShader を呼び出す。シェーダには頂点宣言が含まれている。

DirectX 9.0 では、頂点宣言が頂点シェーダから切り離されて、固定機能パイプラインとシェーダのいずれでも使用できるようになった。

  • 固定機能パイプラインの場合、SetVertexShader を呼び出す必要はない。ただし、固定機能パイプラインに切り替える場合で、以前に頂点シェーダを使っていた場合は、SetVertexShader(NULL) を呼び出す。これを行った後、SetFVF を呼び出して FVF コードを宣言する必要がある。
  • 頂点シェーダを使っている場合は、頂点シェーダ オブジェクトを使って SetVertexShader を呼び出す。さらに、SetFVF を呼び出して頂点宣言を設定する。これには FVF 内の非明示的な情報が使われる。FVF では表現できない頂点宣言をサポートしている SetVertexDeclarationSetFVF の代わりに呼び出すこともできる。

Vsync、Interval、SwapEffect の変更

モニタのリフレッシュ レート、プレゼンテーション速度、フロント バッファ対バック バッファの描画をユーザーがより効果的に制御できるように、いくつかの変更が加えられた。

  • スワップ エフェクトの1 つ (D3DSWAPEFFECT_COPY_VSYNC) とプレゼンテーション速度の 1 つ (D3DPRESENT_RATE_UNLIMITED) が削除された。
  • D3DPRESENT_PARAMETERS.FullScreen_PresentationInterval の名前が PresentationIntervals に変更された。
  • D3DPRESENT_PARAMETERS の D3DPRESENT_INTERVAL_IMMEDIATE メンバが追加された。 これは、プレゼンテーションが垂直同期と同期しないことを意味する。
  • DirectX 8.x と同様、D3DPRESENT_PARAMETERS の D3DPRESENT_INTERVAL_DEFAULT メンバはゼロとして定義され、D3DPRESENT_PARAMETERS の D3DPRESENT_INTERVAL_ONE メンバと同じ意味を持つ。D3DPRESENT_PARAMETERS の D3DPRESENT_INTERVAL_DEFAULT は、memset を使って D3DPRESENT_PARAMETERS をゼロに初期化する場合に便利である。

ウィンドウ モード

  • D3DPRESENT_PARAMETERS の D3DPRESENT_INTERVAL_DEFAULT メンバは D3DPRESENT_PARAMETERS の D3DPRESENT_INTERVAL_ONE メンバとほとんど同じである (後の「タイマ精度」を参照)。どちらも COPY_VSYNC と同様に 1 フレーム 1 プレゼンテーションで実行され、ビームとの不一致によるテアリングを防ぐことができる。これに対し、D3DPRESENT_PARAMETERS の D3DPRESENT_INTERVAL_IMMEDIATE メンバは無制限のプレゼンテーション速度の実現を試みる。
  • ウィンドウ モードには、D3DPRESENT_PARAMETERS の D3DPRESENT_INTERVAL_DEFAULT、D3DPRESENT_INTERVAL_ONE、または D3DPRESENT_INTERVAL_IMMEDIATE メンバを使える。

フルスクリーン モード

  • ウィンドウ モードとフルスクリーン モードを同じように使えるように、リフレッシュ レートやスワップ エフェクトにかかわらず D3DPRESENT_PARAMETERS の D3DPRESENT_INTERVAL_IMMEDIATE メンバがサポートされる。

タイマ精度 - D3DPRESENT_PARAMETERS の D3DPRESENT_INTERVAL_DEFAULT メンバはデフォルトのシステム タイマ精度を使う。 したがって、D3DPRESENT_PARAMETERS の D3DPRESENT_INTERVAL_ONE メンバはシステム タイマ精度を向上するために timeBeginPeriod(1) を呼び出す。これによって垂直同期の質は向上するが、処理に要する時間がわずかに長くなる。どちらのパラメータでも、垂直方向の同期が試みられる。