使用 Higher-Order Primitives (Direct3D 9)

本節說明如何在應用程式中使用較高順序的基本類型。

判斷Higher-Order基本支援

您可以查詢 D3DCAPS9 結構的 DevCaps 成員,以判斷涉及較高順序基本類型之作業的支援層級。 下表列出 Direct3D 9 中與較高順序基本類型相關的裝置功能。

裝置功能 Description
D3DDEVCAPS_NPATCHES 裝置支援 N 修補程式,並以 曲線 PN 三角形 為基礎, (一種特殊的三次方貝塞爾三角形) 。
D3DDEVCAPS_QUINTICRTPATCHES 裝置支援 quintic Bezier 曲線和 B 曲線。
D3DDEVCAPS_RTPATCHES 裝置支援矩形和三角形修補程式 (RT 修補程式) 。
D3DDEVCAPS_RTPATCHHANDLEZERO RT 修補程式可以使用控制碼零有效率地繪製。

 

請注意,D3DDEVCAPS_RTPATCHHANDLEZERO並不表示可以繪製控制碼為零的修補程式。 不論是否已設定此裝置功能,都可以繪製控制碼零修補程式。 設定這項功能時,硬體架構不需要快取任何資訊,而且未快取的修補程式 (處理零) 會像快取一樣有效率地繪製。

繪圖修補程式

Direct3D 9 支援兩種類型的較高順序基本類型,或修補程式。 這些稱為 N-Patchs 和 Rect/Tri 修補程式。 透過 呼叫 IDirect3DDevice9::SetNPatchMode ( nSegments ) nSegments 的值大於 1.0,即可使用任何三角形轉譯呼叫來轉譯 N 修補程式。 Rect/Tri 修補程式必須使用下列明確的進入點來轉譯。

您可以使用下列方法來繪製修補程式。

IDirect3DDevice9::D rawRectPatch 會使用目前設定的資料流程,繪製 pRectPatchInfo 參數所指定的矩形高序修補程式。 Handle 參數是用來將修補程式與控制碼產生關聯,因此下次繪製修補程式時,就不需要重新指定 pRectPatchInfo。 這可讓您預先計算和快取正向差異係數或其他資訊,進而使用相同的控制碼來有效執行 IDirect3DDevice9::D rawRectPatch

它適用于靜態修補程式,應用程式會設定頂點著色器和適當的資料流程、在 pRectPatchInfo 參數中提供修補程式資訊,以及指定控制碼,讓 Direct3D 可以擷取和快取資訊。 接著,應用程式可以呼叫 IDirect3DDevice9::D rawRectPatch, 並將 pRectPatchInfo 設定為 Null 以有效率地繪製修補程式。 繪製快取的修補程式時,會忽略目前設定的資料流程。 不過,您可以藉由指定 pNumSegs 的新值來覆寫快取的 pNumSegs。 此外,在轉譯快取的修補程式時,必須設定相同的頂點著色器,如同擷取時所設定的。

針對動態修補程式,修補程式資料會變更修補程式的每個轉譯,因此快取資訊沒有效率。 應用程式可以將 [控制碼] 設定為 0,將此傳達給 Direct3D。 在此情況下,Direct3D 會使用目前設定的資料流程和 pNumSegs 值繪製修補程式,而不會快取任何資訊。 同時將 Handle 設定為 0 且 pPatch 設定為 Null無效。

藉由重新指定相同控制碼的 pRectPatchInfo,應用程式可以覆寫先前快取的資訊。

IDirect3DDevice9::D rawTriPatch 類似于 IDirect3DDevice9::D rawRectPatch ,不同之處在于它會繪製三角形高序修補程式。

產生法線和紋理座標

如果您使用彈性頂點格式 (FVF) 著色器,則無法自動產生法線和紋理座標。

針對正常狀況,您可以直接提供它們,或讓 Direct3D 為您計算它們。

針對矩形修補程式產生的座標是以曲線為基礎的座標,如下圖所示。

以曲線為基礎的座標的原始紋理和紋理圖例

針對三角形修補程式所產生的座標是以直方曲線為基礎的座標,如下圖所示。

原始紋理的圖例,以及具有直心曲線式座標的紋理

如果應用程式必須變更產生的紋理座標範圍,則可以使用紋理轉換來完成此動作。

較高順序的基本類型