使用 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。 若要進一步瞭解頂點緩衝區中如何參考修補程式資料,請參閱 D3DRECTPATCH_INFO。
- IDirect3DDevice9::D rawTriPatch。 若要進一步瞭解頂點緩衝區中如何參考修補程式資料,請參閱 D3DTRIPATCH_INFO。
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 為您計算它們。
針對矩形修補程式產生的座標是以曲線為基礎的座標,如下圖所示。
針對三角形修補程式所產生的座標是以直方曲線為基礎的座標,如下圖所示。
如果應用程式必須變更產生的紋理座標範圍,則可以使用紋理轉換來完成此動作。
相關主題