我知道,這是類似z緩衝區,發生在輸出合併階段。 它比較ref值和緩衝區值來決定是否可以通過該點。Stencil Buffer的用途是什麼?
但是,我認爲它可以實現的所有效果總是可以通過一個通用緩衝區來實現。 當我們使用渲染來渲染紋理,並將其用作着色器資源視圖時,將其輸入到像素着色器。 然後判斷並決定是否手動剪裁像素。 代碼如下: if(比較值) clip(0); 由於模板緩衝區可以被普通緩衝區替換,我們仍然使用它。 可以使用圖形硬件的加速嗎?(一些特殊指令)
我知道,這是類似z緩衝區,發生在輸出合併階段。 它比較ref值和緩衝區值來決定是否可以通過該點。Stencil Buffer的用途是什麼?
但是,我認爲它可以實現的所有效果總是可以通過一個通用緩衝區來實現。 當我們使用渲染來渲染紋理,並將其用作着色器資源視圖時,將其輸入到像素着色器。 然後判斷並決定是否手動剪裁像素。 代碼如下: if(比較值) clip(0); 由於模板緩衝區可以被普通緩衝區替換,我們仍然使用它。 可以使用圖形硬件的加速嗎?(一些特殊指令)
「輸出合併」是渲染中的關鍵性能路徑之一,所以它一直保持「固定功能」,而其他許多方面現代GPU已經成爲可編程除了各種各樣的測試,你可以用alpha混合做的,你可以用模板數據類似的測試在同一通:
struct D3D11_DEPTH_STENCIL_DESC
{
BOOL DepthEnable;
D3D11_DEPTH_WRITE_MASK DepthWriteMask;
D3D11_COMPARISON_FUNC DepthFunc;
BOOL StencilEnable;
UINT8 StencilReadMask;
UINT8 StencilWriteMask;
struct D3D11_DEPTH_STENCILOP_DESC
{
D3D11_STENCIL_OP StencilFailOp;
D3D11_STENCIL_OP StencilDepthFailOp;
D3D11_STENCIL_OP StencilPassOp;
D3D11_COMPARISON_FUNC StencilFunc;
} FrontFace, BackFace;
};
模板緩衝區用於多種技術,如陰影,反射,貼花等。見wikipedia。
首先:是的,任何你可以(或至少通常會)用模板緩衝區做的事情無疑可以用其他方式完成。像圖形卡的大多數部分一樣,問題是額外的硬件是否可以讓你更快地完成工作(我敢肯定答案往往是肯定的)。
例如,一件相當常見的事情,特別是在廣告文案等事物中,就是將圖像剪裁成某種預定義的形狀,例如夕陽下的海邊拍攝,剪切成一些輪廓寫作:
http://www.tipsquirrel.com/wp-content/uploads/2011/07/Sunset.jpg
模板緩存使得這個完全容易做到非常迅速,在硬件。您將文本渲染到模板緩衝區,然後正常渲染圖片(啓用模板緩衝區)。
這對於諸如電影標題這樣的事情特別有效,其中文本是電影的標題/信用,並且圖片是電影的介紹,改變每一幀。在這種情況下,您可以設置模板緩衝區一次,然後在更新模板緩衝區之前重新使用模板緩衝區(例如,使用下一組信用點)。
現在,你可以用其他方法做同樣的事情(例如,在像素着色器中)。但是,模板緩衝區比其他大多數替代方案更快,更便宜。還有一個歷史事實,即模板緩衝器幾乎永遠存在 - 比可編程着色器更長。
模板印刷是渲染管線中的一個額外步驟,因此只需要一次渲染即可渲染到顏色緩衝區和模板緩衝區。使用顏色緩衝區時,唯一的問題是顏色緩衝區必須具有相同的屬性(格式,h和w)。 –