共用方式為


功能摘要 (適用於 Windows Vista 的 Direct3D 9)

本文件特別指的是適用於 DirectX 圖形的 Windows Vista 延伸模組。 若要開發適用於 Windows Vista 的 DirectX 功能,您必須安裝 Windows Vista SDK 以及 DirectX SDK。 使用 DirectX for Windows Vista 的應用程式必須使用使用 WDDM 驅動程式的硬體(Windows 設備驅動器模型),而不是 XPDM(XP 驅動程式模型):未實作 WDDM 的驅動程式無法具現化 Windows Vista DirectX 圖形介面。

在下列其中一節中探索 Windows Vista 中的新 DirectX 圖形功能:

裝置行為變更

裝置現在只有在兩種情況下會遺失:當硬體因懸掛而被重設時,以及當設備驅動程式停止時。 當硬體停止回應時,可以藉由呼叫 ResetEx來重設裝置。 如果硬體停止回應,紋理記憶體會遺失。

停止驅動程式之後,必須重新建立IDirect9Ex物件才能繼續轉譯。

當簡報區域被視窗模式的另一個視窗遮蔽,或當全螢幕應用程式最小化時,PresentEx 會傳回S_D3DPRESENTATIONOCCLUDED。 當全螢幕應用程式收到 WM_ACTIVATEAPP 回呼訊息時,可以繼續轉譯。

在舊版的 DirectX 中,當應用程式發生模式變更時,復原的唯一方法是重設裝置,並重新建立所有視訊記憶體資源和交換鏈結。 現在使用適用於 Windows Vista 的 DirectX,在模式變更之後呼叫 [重設] 不會造成紋理記憶體表面、紋理和狀態資訊遺失,而且不需要重新建立這些資源。

停用多線程軟體頂點處理

已新增一個新的旗標位元(D3DCREATE_DISABLE_PSGP_THREADING),將停用軟體頂點處理(swvp)的多執行緒功能。 使用此巨集指令來產生 IDirect3D9::CreateDevice 的行為旗標。

#define D3DCREATE_DISABLE_PSGP_THREADING

單位元表面

有一個新的一個位表面格式類型,對於處理文字字元特別有用。 新的格式稱為 D3DFMT_A1。 單位元表面的設計可以當作逐像素紋理使用,或是作為由 ComposeRects 或 ColorFill 產生的渲染目標輸出。 表面寬度和高度沒有個別的上限;實作必須支援 2K 紋素 x 8K 紋素的單一大小表面。

位圖表面每個像素都有一個位元;因此,1 代表像素的所有成分(r、g、b、a)都是 1,而 0 代表所有成分都等於 0。 您可以搭配下列 API 使用單位元表面:ColorFill、UpdateSurface 和 UpdateTexture。

當讀取單位元表面時,執行階段可以執行點取樣或卷積過濾。 卷積篩選條件是可調整的(請參閱 SetConvolutionMonoKernel)。

一位元表面有一些限制:

  • 不支援 Mip 對應
  • sRGB 資料無法讀取或寫入至一位元表面。
  • 一位元表面不能用作頂點紋理或用於多重取樣。

讀取深度/樣板緩衝區

使用 IDirect3DDevice9::UpdateSurface 從 IDirect3DDevice9::CreateDepthStencilSurface 或 IDirect3DDevice9::GetDepthStencilSurface 取得的表面讀取或寫入深度/模板數據。

首先,使用 IDirect3DDevice9::CreateOffscreenPlainSurface 建立可鎖定的、僅深度或僅模板的表面。 使用下列其中一種格式:

  • D3DFMT_D16_LOCKABLE
  • D3DFMT_D32F_LOCKABLE
  • D3DFMT_D32_LOCKABLE
  • D3DFMT_S8_LOCKABLE

其次,在深度/樣板緩衝區與新建立的可鎖定深度或樣板表面之間傳輸數據。 傳輸是使用 IDirect3DDevice9::UpdateSurface 來執行。

當兩個表面都是 LOCKABLE 格式或兩者都不可鎖定時,UpdateSurface 將會失敗。

傳輸不存在的數據會導致錯誤(例如,從不可鎖定的深度表面傳輸到D3DFMT_S8_LOCKABLE表面)。

IDirect3DDevice9::UpdateSurface 的其餘限制仍適用。

共用資源

Direct3D 資源現在可以在裝置或進程之間共用。 這適用於任何 Direct3D 資源,包括紋理、頂點緩衝區、索引緩衝區或表面(例如轉譯目標、深度樣板緩衝區或螢幕外一般表面)。 若要共用,您必須在建立時指定要共用的資源,並在預設集區中找出資源(D3DPOOL_DEFAULT)。 建立資源以供共享之後,即可在進程內跨裝置共用,或跨進程共用。

若要啟用共用資源,資源建立 API 有額外的句柄參數。 這是一個指向共用資源的「HANDLE」。 在先前的 DirectX 修訂中,這個自變數是 API 簽章的一部分,但尚未使用,而且必須設定為 NULL。 從 Windows Vista 開始,請以 pSharedHandle 的下列方式使用:

  • 將指標 (pSharedHandle) 設定為 NULL 不共用資源。 這就像是 Windows Vista 之前的 DirectX 行為。
  • 若要建立共用資源,請使用未初始化的句柄呼叫任何資源建立 API(指標本身不是 NULL (pSharedHandle != NULL),但指標指向 NULL 值 (*pSharedHandle == NULL))。 API 會生成共享資源,並返回有效的控制代碼。
  • 若要使用非NULL 共用資源句柄開啟和存取先前建立的共用資源,請將 pSharedHandle 設定為該句柄的位址。 以這種方式開啟先前建立的共用資源之後,您可以使用 Direct3D 9 或 Direct3D 9Ex API 中的傳回介面,就像介面是該類型的一般資源一樣。

資源建立 API 包括 - CreateTextureCreateVolumeTextureCreateCubeTextureCreateRenderTargetCreateVertexBufferCreateIndexBufferCreateDepthStencilSurfaceCreateOffscreenPlainSurfaceCreateDepthStencilSurfaceExCreateOffscreenPlainSurfaceExCreateRenderTargetEx

使用共用資源有一些限制。 這些包括:

  • 您用來開啟共享資源的 API 必須符合您用來建立共用資源的 API。 例如,如果您使用 CreateTexture 來建立共用資源,則必須使用 CreateTexture 來開啟該共享資源;如果您使用 CreateRenderTarget 來建立共用資源,則必須使用 CreateRenderTarget 開啟該共享資源;等等。
  • 當您開啟共享資源時,必須指定D3DPOOL_DEFAULT。
  • 可鎖定的資源(例如具有D3DUSAGE_DYNAMIC的紋理、頂點緩衝區和索引緩衝區)在共用時可能會遇到效能不佳的情況。 在某些硬體上,無法共享可鎖定的繪製目標。
  • 跨進程共用資源的參考必須具有與原始資源相同的維度。 在跨進程傳遞句柄時,請包含維度資訊,以便能夠以相同方式建立引用。
  • 共用跨進程介面不提供同步處理機制。 共用介面的讀取/寫入變更可能不會在預期時反映參考程序的介面檢視。 若要提供同步處理,請使用事件查詢或鎖定紋理。
  • 只有最初建立共用資源的進程可以鎖定它(開啟該共用資源參考的任何進程都無法鎖定它)。
  • 如果共用資源已鎖定,則無法驗證其他進程,以了解資源是否可用。

混合之前 sRGB 轉換

您現在可以檢查裝置是否可以在框架緩衝區混合之前,將管線數據轉換成 sRGB。 這表示裝置會將渲染目標值從 sRGB 轉換。 若要檢視硬體是否支援轉換,請檢查此上限:

D3DPMISCCAPS_POSTBLENDSRGBCONVERT

此上限會識別支援在混合之前轉換成 sRGB 的硬體。 這項功能對於在桌面視窗管理員(DWM)中使用 fp16 畫面緩衝區進行高品質渲染非常重要。

StretchRect 改善

在舊版的 DirectX 中,StretchRect 有許多限制來容納不同的驅動程式(請參閱 IDirect3DDevice9::StretchRect)。 Windows Vista 建置在 Windows 設備驅動器模型 (WDDM) 上。 這個新的驅動程式模型更強固,可讓驅動程式在硬體中處理特殊案例。

一般而言,唯一的剩餘限制是轉譯目標必須使用轉譯目標使用方式建立(D3DUSAGE_RENDERTARGET)。 如果您執行簡單的複製操作,這項限制將會解除(當來源和目標的格式相同、大小相同,且沒有子矩形時)。

系統記憶體中的紋理建立

使用、配置和刪除系統記憶體時,需要更多彈性的應用程式現在可以從系統記憶體指標建立紋理。 例如,應用程式可以從 GDI 系統記憶體位圖指標建立 Direct3D 紋理。

您必須執行兩件事來建立這類紋理:

  • 配置足夠的系統記憶體來保存紋理表面。 位元組數目下限為寬度 x 高度 x 像素位元組。
  • 將指標的地址傳遞給您的系統記憶體表面,用作 IDirect3DDevice9::CreateTexture 的 HANDLE* 參數。

以下是 IDirect3DDevice9::CreateTexture 的函式原型:

STDMETHOD(CreateTexture)(THIS_ UINT Width, UINT Height, UINT Levels, 
    DWORD Usage, D3DFORMAT Format, D3DPOOL Pool, IDirect3DTexture9** ppTexture, 
    HANDLE* pSharedHandle)

系統記憶體紋理有下列限制:

  • 紋理間距必須等於紋理寬度乘以每像素的字節數。
  • 使用壓縮格式 (DXT 格式) 時,應用程式會負責配置正確的大小。
  • 僅支援具有單一 Mipmap 層級的紋理。
  • 傳遞給 CreateTexture 的 Pool 參數的值必須為 D3DPOOL_SYSTEMMEM。
  • 此 API 會將提供的記憶體包裝在紋理中。 在您完成對此記憶體的使用之前,請勿解除分配此記憶體。