Stencil Buffer用于什么?

时间:2016-07-06 00:57:34

标签: c++ 3d direct3d

我知道像z-buffer这样的东西发生在输出合并阶段。 并且它比较ref值和缓冲值以决定是否可以传递该点。

但是,我认为它可以实现的所有效果总是可以通过公共缓冲区实现。 当我们使用渲染到纹理并将其用作着色器资源视图时,将其输入到像素着色器。 然后判断并决定是否手动剪辑像素。 代码是这样的: if(比较值)     夹(0); 由于模板缓冲区可以用公共缓冲区替换,我们仍然使用它。 可以使用图形硬件的加速吗?(一些特殊说明)

2 个答案:

答案 0 :(得分:2)

"输出合并"是渲染中关键性能路径之一,因此它仍然具有“固定功能”。而现代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

答案 1 :(得分:0)

首先:是的,你可以(或者至少通常会)使用模板缓冲区做的任何事情无疑都可以通过其他方式完成。像显卡的大多数部分一样,问题是额外的硬件是否能让你更快地完成工作(而且我很确定答案通常是肯定的。)

例如,有一件相当常见的事情,特别是在广告文案等方面,有一个图像被剪裁成某种预定义的形状,就像日落时海岸的镜头一样,剪裁成一些写作的轮廓:

http://www.tipsquirrel.com/wp-content/uploads/2011/07/Sunset.jpg

模板缓冲区使得在硬件中快速完成这一过程非常简单。您将文本渲染到模板缓冲区,然后正常渲染图片(启用模板缓冲区)。

这对于电影片名等特别有效,其中文本是电影的标题/片尾,图片是电影的介绍,每一帧都在变化。在这种情况下,您可以设置一次模板缓冲区,然后在更新之前将其重复使用多个连续帧(例如,使用下一组信用)。

现在,你可以用其他方式做同样的事情(例如,在像素着色器中)。然而,模板缓冲器比大多数替代品更快,更便宜。还有一个历史事实,即模板缓冲区几乎永远存在 - 比可编程着色器更长。

相关问题