共用方式為


樣板緩衝區

樣板緩衝區 用來遮罩影像中的像素,以產生特殊效果。 遮罩會控制像素是否被繪製。 這些特殊效果包括合成、貼花、溶解、淡出和撥動、外框和剪影、雙面樣板。 以下顯示一些較常見的效果。

樣板緩衝區可以逐像素地啟用或停用繪製到渲染目標表面的功能。 在最基本的層級,它可讓應用程式遮罩轉譯影像的區段,使其不會顯示。 應用程式通常會使用樣板緩衝區進行特殊效果,例如溶解、貼圖和描邊。

樣板緩衝區資訊內嵌在 z 緩衝區數據中。

樣板緩衝區的運作方式

Direct3D 會對模板緩衝區的內容進行逐像素測試。 針對目標介面中的每個圖元,它會使用樣板緩衝區中的對應值、樣板參考值和樣板遮罩值來執行測試。 如果測試通過,Direct3D 會執行動作。 測試是使用下列步驟來執行。

  1. 使用樣板遮罩執行樣板參考值的位 AND 運算。
  2. 針對具有樣板遮罩的目前像素執行樣板緩衝區值的位 AND 運算。
  3. 使用比較函式,比較步驟 1 的結果與步驟 2 的結果。

上述步驟會顯示在下列程式代碼列中:

(StencilRef & StencilMask) CompFunc (StencilBufferValue & StencilMask)
  • StencilRef 代表樣板參考值。
  • StencilMask 代表樣板遮罩的值。
  • CompFunc 是比較函式。
  • StencilBufferValue 是當前像素的樣板緩衝區內容。
  • ampersand (&) 符號代表位 AND 運算。

如果樣板測試通過,則當前像素寫入目標表面,否則忽略。 預設的比較行為是寫入像素,無論每個位元運算的結果如何。您可以透過變更列舉型別的值來指定所需的比較函式,以改變此行為。

您的應用程式可以自訂樣板緩衝區的運作。 它可以設定比較函式、樣板遮罩和樣板參考值。 它也可以控制 Direct3D 在樣板測試通過或失敗時所採取動作。

合成

您的應用程式可以使用樣板緩衝區,將 2D 或 3D 影像複合到 3D 場景。 樣板緩衝區中的遮罩可用來遮蔽轉譯目標表面的區域。 已儲存的 2D 資料,例如文字或點陣圖,可以寫入被遮蔽的區域。 或者,您的應用程式可以將其他 3D 圖元渲染至樣板遮罩的渲染目標表面。 它甚至可以轉譯整個場景。

遊戲通常會將多個 3D 場景組合在一起。 例如,駕駛遊戲通常會顯示後視鏡。 鏡子中顯示了駕駛後方的 3D 場景視圖。 它基本上是將第二個 3D 場景與駕駛者的前方視野結合在一起。

貼花

Direct3D 應用程式會使用貼花技術來控制從特定基本影像繪製到渲染目標表面的圖元。 應用程式會將貼花套用至基本類型的影像,讓共面多邊形能夠正確呈現。

例如,將輪胎標記和黃色線條套用至道路時,標記應該直接出現在道路頂端。 不過,標記和道路的 z 值相同。 因此,深度緩衝區可能不會產生兩者之間的乾淨分隔。 後端基本類型中的某些圖元可能會呈現在前端基本類型之上,反之亦然。 產生的影像會在每一幀之間閃閃發光。 這種效果稱為 深度衝突閃爍

若要解決此問題,請使用模板來遮罩貼圖將會出現的後基元區段。 關閉 z 緩衝,並將前景原始圖元的影像渲染到渲染目標表面的已遮罩區域。

雖然多個紋理混合可以用來解決這個問題,但這樣做會限制應用程式可以產生的其他特殊效果數目。 使用樣板緩衝區來套用裝飾,釋放紋理混合階段以取得其他效果。

溶解、淡出和滑動

越來越多的應用程式採用在電影以及視訊中常用的特殊效果,例如溶解、滑動和淡出。

在溶解中,一個影像會逐漸由另一個影像在平滑的畫面序列中取代。 雖然 Direct3D 提供使用多個紋理混合來達到相同效果的方法,但是使用樣板緩衝區溶解的應用程式可以在溶解時,使用紋理混合功能進行其他效果。

當應用程式執行溶解時,它必須轉譯兩個不同的影像。 它會使用樣板緩衝區來控制從每個影像中選擇的像素並繪製到渲染目標表面。 您可以定義一系列的樣板遮罩,並將其複製到後續畫面格上的樣板緩衝區。 或者,您可以定義第一個畫面的基底樣板遮罩,然後逐步改變它。

在溶解開始時,您的應用程式會設定模板功能和模板遮罩,讓起始影像中的大部分像素通過模板測試。 最終影像中的大部分像素應該未通過樣板測試。 在每個後續畫面中,樣板遮罩會更新,使起始影像中的圖元通過測試的數量越來越少。 當影像逐漸進行時,結束影像中未通過測試的像素愈來愈少。 如此一來,您的應用程式就可以使用任何任意溶解模式來執行溶解。

淡入或淡出是溶解的特殊案例。 淡入時,樣板緩衝區會用來從黑色或白色影像過渡到 3D 場景的渲染。 淡出效果是相反的,您的應用程式將從呈現 3D 場景開始,然後逐漸轉變為黑色或白色。 淡出可以使用您想要採用的任何任意模式來完成。

Direct3D 應用程式會針對撥動使用類似的技術。 例如,當應用程式執行由左至右的撥動時,結束影像會從左到右逐漸滑動,並覆蓋在起始影像的頂端。 如同在淡化效果中,您必須定義一系列樣板遮罩,這些遮罩會在連續的畫面中載入至樣板緩衝區,或者連續修改起始遮罩。 樣板遮罩可用來停用從開始影像寫入圖元,以及啟用從結束影像寫入圖元。

撥動比溶解更複雜,您的應用程式必須以撥動的反向順序從結束影像讀取圖元。 也就是說,如果撥動從左至右移動,您的應用程式必須從右至左讀取結束影像的圖元。

輪廓和剪影

您可以使用樣板緩衝區來取得更抽象的效果,例如描邊和剪影。

如果您的應用程式對一個形狀相同但略小的圖形基元影像應用了樣板遮罩,則結果影像只包含該圖形基元的外框。 然後,應用程式可以使用純色填滿影像的樣板遮罩區域,讓基礎圖形呈現浮雕的外觀。

如果樣板遮罩的大小和形狀與您正在呈現的圖元相同,則產生的影像會在圖元所在的位置留下空洞。 然後,您的應用程式可以使用黑色填滿空白,以產生基本形狀的剪影。

雙面樣板

陰影體積用於使用樣板緩衝區繪製陰影。 應用程式經由計算遮擋幾何的剪影邊緣,並將其向遠離光源的方向拉伸成一組 3D 體積來計算陰影體積。 然後,這些體積會被兩次渲染到範本緩衝區中。

第一次渲染會繪製正向多邊形,並遞增樣板緩衝區值。 第二次渲染會繪製陰影體積的背向多邊形,並遞減模板緩衝區值。 一般而言,所有遞增和遞減的值都會互相抵消。然而,場景已經以正常的幾何圖形呈現,導致某些像素在渲染陰影體積時未能通過 z 緩衝區測試。 樣板緩衝區中保留的值對應於陰影中的像素。 這些剩餘的樣板緩衝區內容會作為遮罩,將大型全覆蓋的黑色四邊形以 Alpha 混合的方式融入場景中。 使用樣板緩衝區作為遮罩,結果是使處於陰影中的像素變暗。

這表示每個光源會繪製陰影幾何兩次,因此對 GPU 的頂點輸送量施加壓力。 雙面樣板功能的設計是為了減輕這種情況。 在此方法中,有兩組樣板狀態(如下所示),一組分別針對正面三角形,另一組用於反向三角形。 如此一來,每個陰影容積、每個光源只需繪製一次。

深度和樣板緩衝區