樣板緩衝區是什嗎?
樣板緩衝區是一個記錄每個像素資訊的附加的緩衝區,很象一個 z 緩衝區。 實際上,該緩衝區就駐在 z 緩衝區的某些位中。常見的模板/z 緩衝區格式為 15 位的 z 和 1 位的模板,或 24 位的 z 和 8 位的模板。在描繪多邊形時,可以針對每個像素,對模板的內容進行簡單的算術操作。例如,可以增加或減少樣板緩衝區,或在模板值沒能通過一項簡單的比較測試時,拒絕像素。可以將框架緩衝區的一個地區標出,然後只對標出(或未標出)的地區進行描繪,上述操作對於此類效果十分有用。各種體積效果就是很好的例子,比如陰影量。
我如何使用樣板緩衝區來描繪陰影量?
這一效果以及其它體積樣板緩衝區效果的關鍵在於樣板緩衝區和 z 緩衝區之間的互動作用。帶有陰影量的情境是分三個階段描繪的。首先,照常使用 z 緩衝區來描繪沒有陰影的情境。然後,在樣板緩衝區中將陰影標出,如下所示。使用不可見的多邊形繪製陰影量的正面,其中 z 測試被啟用,而 z 寫入被禁用,且在每有一個像素通過 z 測試時,就將樣板緩衝區增加一次。以同樣方式描繪陰影量的背面,但是要減少模板值。
現在,請考慮單獨一個像素的情形。假設攝像機不在陰影量中,情境中的相應點就有有四種可能性。如果從攝像機到點的光線不與陰影量相交,則不會繪製任何的陰影多邊形,而樣板緩衝區依舊為零。否則,如果點在陰影量的前面,則陰影多邊形會被輸出 z 緩衝區,而模板依舊保持不變。如果點位於陰影量下面,則會描繪同樣多的正面陰影,而模板為零,即增加的次數與減少的次數一樣多。
最後一種可能性就是點位於陰影量中。在這種情況下,陰影量的背面會被輸出 z 緩衝區,但正面則不然,因而樣板緩衝區會為非零。結果就是,框架緩衝區位於陰影中的一些部分具有非零的模板值。最後,要實際描繪陰影,整個情境會被一個 alpha 混色的多邊形集充溢一遍,其中僅模板值非零的像素受到影響。在隨 DirectX SDK 一起提供的 "Shadow Volume" 樣本中有關於該技巧的一個樣本。