設定深度樣板功能
本節旨在說明深度樣板緩衝區的設定步驟,以及輸出合併階段的的深度樣板狀態。
一旦您知道如何使用深度樣板緩衝區和對應的深度樣板狀態,請參閱進階樣板技術。
建立深度樣板狀態
深度樣板狀態會告訴輸出合併階段如何執行深度樣板測試。 深度樣板測試會判斷是否應該繪製指定的像素。
將深度樣板資料繫結至 OM 階段
繫結深度樣板狀態。
使用檢視繫結深度樣板資源。
轉譯目標必須全部是相同的資源類型。 如果使用多重取樣消除鋸齒,所有繫結的轉譯目標和深度緩衝區都必須具有相同的樣本計數。
當緩衝區當做轉譯目標使用時,不支援深度樣板測試和多個轉譯目標。
- 可以同時繫結多達 8 個轉譯目標。
- 所有轉譯目標在所有維度中都必須有相同的大小 (寬度和高度,以及 *陣列型態的 3D 或陣列大小的深度)。
- 每個轉譯目標可能會有不同的資料格式。
- 寫入遮罩可控制將哪些資料寫入轉譯目標。 輸出寫入遮罩在每個轉譯目標、每個元件層級上控制將哪些資料寫入轉譯目標。
進階樣板技術
深度樣板緩衝區的樣板部分可用於建立轉譯效果,例如合成、印花和輪廓。
合成
您的應用程式可以使用樣板緩衝區,將 2D 或 3D 影像合成到 3D 場景中。 樣板緩衝區中的遮罩會用來遮蔽轉譯目標表面中的區域。 隨後,所儲存的 2D 資訊 (例如文字或點陣圖) 可寫入至遭到遮蔽的區域。 或者,應用程式也能將額外的 3D 原始物件轉譯為所所轉譯目標表面的樣板遮罩區域。 它甚至可以轉譯整個場景。
遊戲通常會將多個 3D 場景合而為一。 舉例來說,賽車遊戲通常會顯示後照鏡。 後照鏡會呈現駕駛後方的 3D 場景檢視畫面。 就本質上而言,後照鏡為合成至駕駛前方檢視畫面的第二個 3D 場景。
印花
Direct3D 應用程式會使用印花來控制特定原始物件影像的哪個像素會繪製至轉譯目標表面。 應用程式會將印花套用至原始物件的影像,好讓共面多邊形能正確轉譯。
舉例來說,將輪胎標記和黃色線條套用至道路時,標記應直接出現在道路上方。 不過,標記和道路的 z 值則完全相同。 因此,深度緩衝區可能不會在兩者之間產生明確的區隔。 後方原始物件中的部分像素可能會轉譯至前方原始物件的上方,反之亦然。 所產生的影像會在畫面格之間閃爍。 這個效果就是所謂的 z 衝突或閃現。
若要解決這個問題,請使用樣板來遮罩後方原始物件上使用印花的部分。 請關閉 Z 緩衝,並將前方原始物件的影像轉譯至轉譯目標表面的關閉遮罩的區域。
多個紋理混合可用來解決此問題。
外框和剪影
您可以使用樣板緩衝區進行更抽象的效果,例如外框和剪影。
如果您的應用程式執行兩個轉譯傳遞 - 一個產生樣板遮罩,第二個用來將樣板遮罩套用至影像,但在第二次傳遞時,基本類型稍微小一點,則產生的影像只會包含基本類型的外框。 隨後,應用程式可以使用純色來填滿樣板遮罩的影像區域,繼而賦予原始物件浮凸外觀。
如果樣板遮罩的大小和形狀與您轉譯的原始物件相同,則產生的影像就會包含應為原始物件的洞。 隨後,您的應用程式可使用黑色填滿整個洞,以產生原始物件的剪影。
雙面樣板
陰影體會用來使用樣板緩衝區繪製陰影。 應用程式會透過遮蔽幾何、運算剪影邊緣,以及將其從光線立體化為一組 3D 體積,藉此運算陰影體轉換。 隨後,這些體積會轉譯兩次,以轉譯至樣板緩衝區。
第一次轉譯會繪製正向多邊形,並遞增樣板緩衝區值。 第二次轉譯會繪製陰影體的反向多邊形,並遞減樣板緩衝區值。
一般而言,所有遞增和遞減值會相互抵銷。不過,場景已使用一般幾何產生,造成某些像素無法隨著陰影體轉譯來通過 z 衝突測試。 樣板緩衝區中剩餘的值會對應至陰影中的像素。 這些剩餘的樣板緩衝區內容會做為遮罩使用,以將大型、包含所有項目的黑色四邊形 Alpha 混色至場景中。 使用樣板緩衝區做為遮罩的結果,會讓陰影中的像素變暗。
這表示,陰影幾何會依照光源來繪製兩次,進而對 GPU 的頂點輸送量增添壓力。 雙面樣板功能的設計用意,在於緩解上述情況。 這個方法包含兩組樣板狀態 (名稱如下所示),其中一組會針對正向三角形來設定,另一組則針對反向三角形。 這樣一來,每個陰影體就只會根據燈光來繪製單一傳遞。
將深度樣板緩衝區讀取為紋理
著色器可以讀取非使用中的深度樣板緩衝區做為紋理。 將深度樣板緩衝區讀取為紋理以兩次傳遞呈現的應用程式,第一次傳遞會寫入深度樣板緩衝區,而第二次會從緩衝區讀取。 這可讓著色器比較先前寫入緩衝區的深度或樣板值,與目前呈現之圖元的值相比較。 比較的結果可用於在粒子系統中建立陰影對應或軟粒子等效果。