共用方式為


轉換為 Direct3D 9

下列功能已在 Microsoft Direct3D 9 中變更。 如果您使用這些功能,請參閱下列變更,以協助您將應用程式移植到 Direct3D 9。

BaseVertexIndex 變更

在 DirectX 8.x 中,IDirect3DDevice8::SetIndices 需要索引緩衝區的指標,以及頂點緩衝區中起始位置的 BaseVertexIndex。 將不同物件批次處理到頂點緩衝區的應用程式必須切換索引緩衝區 (或呼叫 IDirect3DDevice8::SetIndices) ,再呼叫 IDirect3DDevice8::D rawIndexedPrimitive。

在 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 硬體品質實驗室 (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

列舉相當於相同格式的 Alpha 和非pha 版本。 傳回的格式一律會填入應用程式所提供的相同格式。

這個方法會將 565 和 555 視為相等,並以 Format 傳回正確的版本。 只有在應用程式鎖定上一個緩衝區時,才會發生差異,而且應用程式必須設定明確的旗標才能完成此動作。

取得/SetStreamSource 變更

已將一個參數新增至 GetStreamSourceSetStreamSource 方法。 位移是資料流程開頭與頂點資料開頭之間的位元組數目。 其測量單位是位元組。 這可讓管線支援資料流程位移。 若要瞭解裝置是否支援串流位移,請參閱D3DDEVCAPS2_STREAMOFFSET。

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

多重取樣品質變更

先前只有 D3DMULTISAMPLE_TYPE 列舉。 Direct3D 9 會保留此列舉,並針對列舉的每個元素新增品質等級的概念。 品質等級表示視覺品質與效能之間的取捨,方法是指出D3DRS_MULTISAMPLEMASK) (可遮罩樣本的數目。

應用程式應該選擇需要多少可遮罩樣本,然後查閱 pQualityLevels。 如果為非零,這個值表示應用程式可透過 MultiSampleQuality 傳遞至各種建立函式的品質等級。 由於驅動程式會在D3DMULTISAMPLE_NONMASKABLE公開其所有多重取樣配置做為品質等級,因此如果您的應用程式不需要遮罩樣本,您可以透過這個類型列舉所有可用的多重取樣配置。

D3DPRASTERCAPS_STRETCHBLTMULTISAMPLE端點位已淘汰。 這個位用來表示多重取樣方法不支援寫入遮罩,而且無法在 BeginSceneEndScene之間開啟和關閉。 這類不可遮罩的方法現在會透過D3DMULTISAMPLE_NONMASKABLE公開。

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

每個可遮罩樣本數目都有不同的最大值。 例如,D3DMULTISAMPLE_4_SAMPLES可能有三種品質層級,而D3DMULTISAMPLE_2_SAMPLES可能只有一個。 (不允許驅動程式表達更多) ,每個可遮罩樣本的數量最多有八個層級。 品質範圍從零到 (*pQualityLevels - 1) 。

ResourceManagerDiscardBytes 變更

ResourceManagerDiscardBytes 已由 IDirect3DDevice9::EvictManagedResources 取代。 它可以收回所有資源,包括 Direct3D 和驅動程式資源。

資源管理員現在會在資源 (受控或非受控) 建立失敗時諮詢,因為視訊記憶體不足。 系統會自動要求管理員釋放足夠的資源,讓建立成功。 在 DirectX 8.0 中,這不是自動化程式。

SetSoftwareVertexProcessing 變更

應用程式可以建立混合模式裝置,以使用軟體和硬體頂點處理。

若要在 DirectX 8.x 中的兩個頂點處理模式之間切換,請呼叫 IDirect3DDevice8::SetRenderState。 這已取代為 SetSoftwareVertexProcessing ,以簡化狀態欄塊所造成的問題。 這個新方法不會由狀態欄塊記錄。

紋理取樣器變更

Direct3D 9 使用圖元著色器 2_0 模型,在一次傳遞中支援最多十六個紋理表面;不過,紋理座標的數目仍然限制為 8。 紋理階段狀態與表面、座標集、頂點處理和圖元處理相關聯。 為了在編譯時期管理這些差異, SetTextureStageState 已分成兩種方法:

  • IDirect3DDevice9::SetTextureStageState 仍會用於紋理座標狀態,例如包裝模式和紋理座標產生。
  • SetSamplerState 已新增,現在將用於篩選、並排、固定、MIPLOD 等等。 這最多適用于十六個取樣器。

SetTextureStageState 變更

IDirect3DDevice9::SetTextureStageState 現在會設定下列狀態:

  • 已修正函式頂點處理狀態。 此狀態會控制紋理座標的操作D3DTSS_TEXTURETRANSFORMFLAGS和D3DTSS_TEXCOORDINDEX。 最多可以設定 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 所代表的數位。

應用程式可用的紋理取樣器數目取決於圖元著色器版本,如下表所示。

名稱 數字
ps_1_1至 ps_1_3 4 個紋理取樣器
ps_1_4 6 個紋理取樣器
ps_2_0 16 個紋理取樣器
固定函式管線 MaxTextureBlendStages/MaxSimultaneousTextures 紋理取樣器

 

支援 Direct3D 9 中位移對應的裝置將支援額外的取樣器 (D3DDMAPSAMPLER) ,以取樣鑲嵌器單位中的位移對應。

SetSamplerState 變更

IDirect3DDevice9::SetSamplerState 會設定取樣器狀態 (包括鑲嵌器單位中使用的取樣器單位中的取樣位移對應) 。 這些已使用 D3DSAMP_ 前置詞重新命名,以在從 DirectX 8.x 移植時啟用編譯時期錯誤偵測。 狀態包括:

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

頂點宣告變更

頂點宣告現在與頂點著色器建立分離。 頂點宣告現在使用元件物件模型 (COM) 介面。

針對 DirectX 8.x,頂點宣告會系結至頂點著色器。

  • 針對固定函式管線,使用彈性頂點格式呼叫 SetVertexShader , (FVF) 頂點緩衝區的程式碼。
  • 針對頂點著色器,使用先前建立頂點著色器的控制碼呼叫 IDirect3DDevice9::SetVertexShader。 著色器包含頂點宣告。

針對 Direct3D 9,頂點宣告會與頂點著色器分離,而且可以搭配固定函式管線或著色器使用。

  • 針對固定函式管線,不需要呼叫 IDirect3DDevice9::SetVertexShader。 不過,如果您想要切換至固定函式管線,且先前已使用頂點著色器,請呼叫 IDirect3DDevice9::SetVertexShader (Null) 。 完成此動作之後,您仍然需要呼叫 SetFVF 來宣告 FVF 程式碼。
  • 使用頂點著色器時,使用頂點著色器物件呼叫 IDirect3DDevice9::SetVertexShader。 此外,請呼叫 IDirect3DDevice9::SetFVF 來設定頂點宣告。 這會使用 FVF 中隱含的資訊。 您可以呼叫 SetVertexDeclaration 來取代 IDirect3DDevice9::SetFVF,因為它支援無法使用 FVF 表示的頂點宣告。

間隔和 SwapEffects 變更

已進行數項變更,讓使用者對監視器重新整理速率、簡報速率和前端緩衝區繪圖有更大的控制權。 如下所示:

  • 已移除一個交換效果、D3DSWAPEFFECT_COPY_VSYNC和一個簡報速率,D3DPRESENT_RATE_UNLIMITED。
  • 已重新命名D3DPRESENT_PARAMETERS。FullScreen_PresentationInterval至 PresentationIntervals。
  • 已新增D3DPRESENT_INTERVAL_IMMEDIATE,這表示簡報不會與垂直同步處理同步。如同 DirectX 8.x,D3DPRESENT_INTERVAL_DEFAULT定義為零,相當於D3DPRESENT_INTERVAL_ONE。 D3DPRESENT_INTERVAL_DEFAULT是將D3DPRESENT_PARAMETERS初始化為零的便利性。

如需支援的模式和間隔的詳細說明,請參閱 D3DPRESENT。

Direct3D 9 圖形