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_ACTI加值稅EAPP回 呼訊息時繼續轉譯。
在舊版 DirectX 中,當應用程式發生模式變更時,復原的唯一方式就是重設裝置,並重新建立所有視訊記憶體資源和交換鏈結。 現在使用適用于 Windows Vista 的 DirectX 時,在模式變更之後呼叫 [重設] 並不會造成紋理記憶體表面、紋理和狀態資訊遺失,而且不需要重新建立這些資源。
已新增新的 caps 位 (D3DCREATE_DISABLE_PSGP_THREADING) ,這會停用軟體頂點處理 (swvp) 的多執行緒處理。 使用此宏來產生 IDirect3D9::CreateDevice 的行為旗標。
#define D3DCREATE_DISABLE_PSGP_THREADING
有新的一個位表面格式類型,對於處理文字圖像特別有用。 新的格式稱為 D3DFMT_A1。 一位表面的設計目的是要當做每圖元紋理使用,或 ComposeRects 或 ColorFill 所產生的轉譯目標輸出。 表面寬度和高度沒有個別的上限;實作必須支援 2K 紋素 x 8K 紋素的單一大小表面。
一位表面每個紋素有一個位;因此,一個表示所有元件都 (r,g,b,圖元) 為 1,零表示所有元件都等於 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 包括 - CreateTexture、 CreateVolumeTexture、 CreateCubeTexture、 CreateRenderTarget、 CreateVertexBuffer、 CreateIndexBuffer、 CreateDepthStencilSurface、 CreateOffscreenPlainSurface、 CreateDepthStencilSurfaceEx、 CreateOffscreenPlainSurfaceEx和 CreateRenderTargetEx。
使用共用資源有一些限制。 其中包括:
- 您用來開啟共用資源的 API 必須符合您用來建立共用資源的 API。 例如,如果您使用 CreateTexture 來建立共用資源,則必須使用 CreateTexture 來開啟該共用資源;如果您使用 CreateRenderTarget 來建立共用資源,則必須使用 CreateRenderTarget 來開啟該共用資源;依此類歸。
- 當您開啟共用資源時,必須指定D3DPOOL_DEFAULT。
- 可鎖定的資源 (具有D3DUSAGE_DYNAMIC、頂點緩衝區和索引緩衝區的紋理,例如,共用時) 可能會遇到效能不佳的情況。 某些硬體上無法共用可鎖定的轉譯目標。
- 跨進程共用資源的參考必須與原始資源具有相同的維度。 跨進程傳遞控制碼時,請包含維度資訊,以便以相同方式建立參考。
- 共用跨進程介面不會提供同步處理機制。 共用表面的讀取/寫入變更可能不會在預期的情況下反映參考程式的介面檢視。 若要提供同步處理,請使用事件查詢或鎖定紋理。
- 只有一開始建立共用資源的進程可以鎖定它 (開啟該共用資源參考的任何進程都無法鎖定它) 。
- 如果共用資源已鎖定,則不會驗證其他進程,以瞭解資源是否可用。
您現在可以檢查裝置是否可以在畫面緩衝區混合之前,將管線資料轉換成 sRGB。 這表示裝置會從 sRGB 轉換轉譯目標值。 若要查看硬體是否支援轉換,請檢查此上限:
D3DPMISCCAPS_POSTBLENDSRGBCONVERT
此上限會識別支援在混合之前轉換為 sRGB 的硬體。 此功能對於桌面視窗管理員中 fp16 框架緩衝區 (DWM) 的高品質轉譯很重要。
在舊版 DirectX 中,StretchRect 有許多限制可容納不同的驅動程式, (請參閱 IDirect3DDevice9::StretchRect) 。 Windows Vista 建置在 Windows 設備磁碟機模型 (WDDM) 上。 這個新的驅動程式模型更強固,並可讓驅動程式處理硬體中的特殊案例。
一般而言,唯一的剩餘限制是轉譯目標必須使用轉譯目標使用方式建立 (D3DUSAGE_RENDERTARGET) 。 如果您要執行簡單的複製 (來源和 dest 的格式相同、大小相同,而且沒有子矩形) ,就會隨即提高此限制。
對系統記憶體的使用、配置和刪除需要更多彈性的應用程式,現在可以從系統記憶體指標建立紋理。 例如,應用程式可以從 GDI 系統記憶體點陣圖指標建立 Direct3D 紋理。
您需要執行兩件事來建立這類紋理:
- 配置足夠的系統記憶體來保存紋理表面。 位元組數目下限為 x 高度 x 圖元的寬度 x 位元組。
- 將 HANDLE* 參數的指標位址傳遞至 IDirect3DDevice9::CreateTexture 的系統記憶體介面。
以下是 IDirect3DDevice9::CreateTexture 的函式原型:
STDMETHOD(CreateTexture)(THIS_ UINT Width, UINT Height, UINT Levels,
DWORD Usage, D3DFORMAT Format, D3DPOOL Pool, IDirect3DTexture9** ppTexture,
HANDLE* pSharedHandle)
系統記憶體紋理有下列限制:
- 紋理間距必須等於每個圖元位元組數目的紋理寬度。
- 使用壓縮格式 (DXT 格式) 時,應用程式會負責配置正確的大小。
- 僅支援具有單一 Mipmap 層級的紋理。
- 針對 Pool 引數傳遞至 CreateTexture 的值必須D3DPOOL_SYSTEMMEM。
- 此 API 會將提供的記憶體包裝在紋理中。 在您完成此記憶體之前,請勿解除配置此記憶體。