使用 Higher-Order 基本圖元(Direct3D 9)
本節說明如何在應用程式中使用順序較高的基本類型。
判斷原始類型支援 Higher-Order
您可以查詢 D3DCAPS9 結構的 DevCaps 成員,以判斷涉及較高順序基本類型之作業的支援層級。 下表列出 Direct3D 9 中與較高順序基本類型相關的裝置功能。
裝置功能 | 描述 |
---|---|
D3DDEVCAPS_NPATCHES | 裝置支援 N 修補程式,並以 曲線 PN 三角形 為基礎(一種特殊的立方貝塞爾三角形)。 |
D3DDEVCAPS_QUINTICRTPATCHES | 裝置支援 quintic Bezier 曲線和 B 曲線。 |
D3DDEVCAPS_RTPATCHES | 裝置支援矩形和三角形貼片(RT 貼片)。 |
D3DDEVCAPS_RTPATCHHANDLEZERO | RT 修補程式可以使用句柄零有效率地繪製。 |
請注意,D3DDEVCAPS_RTPATCHHANDLEZERO 並不表示可以繪製句柄為零的修補程式。 不論是否已設定此裝置功能,都可以繪製句柄零修補程式。 設定這項功能時,硬體架構不需要快取任何資訊,而且未快取的補丁(句柄為零)也可以像已快取的補丁一樣有效率地繪製。
繪圖補丁
Direct3D 9 支援兩種類型的較高階基本類型,或修補程式。 這些稱為 N 修補程式和 Rect/Tri 修補程式。 透過呼叫 IDirect3DDevice9::SetNPatchMode(nSegments),並確保 nSegments 值大於 1.0,即可在任何三角形渲染呼叫中啟用 N-patches 來進行渲染。 Rect/Tri 修補程序必須使用下列明確的進入點來轉譯。
您可以使用下列方法來繪製修補程式。
- IDirect3DDevice9::DrawRectPatch。 若要進一步瞭解頂點緩衝區中如何參考修補程式數據,請參閱 D3DRECTPATCH_INFO。
- IDirect3DDevice9::DrawTriPatch。 如需更好地理解頂點緩衝區中對修補程式數據的參考方式,請參閱 D3DTRIPATCH_INFO。
IDirect3DDevice9::DrawRectPatch 使用目前設定的數據流,繪製由 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::DrawTriPatch 類似於 IDirect3DDevice9::DrawRectPatch,不同之處在於它會繪製三角形高階補丁。
產生常態和紋理座標
如果您使用彈性頂點格式 (FVF) 著色器,則無法自動產生法線和紋理座標。
針對正常狀況,您可以直接提供它們,或讓 Direct3D 為您計算它們。
為矩形補丁產生的座標是以樣條曲線為基礎的座標,如下圖中的說明所示。
針對三角形面片生成的座標是以重心樣條為基礎的座標,如下圖所示。
如果應用程式必須變更產生的紋理座標範圍,則可以使用紋理轉換來完成。
相關主題