【问题标题】:What does Stencil Buffer use for?模板缓冲区有什么用途?
【发布时间】:2016-07-06 00:57:34
【问题描述】:

我知道这类似于 z-buffer,发生在输出合并阶段。 并比较ref值和buffer值来决定是否可以通过。

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

【问题讨论】:

  • Stenciling 是渲染管道中的一个附加步骤,因此只需要一次渲染到颜色缓冲区和模板缓冲区。使用颜色缓冲区,唯一的问题是颜色缓冲区必须具有相同的属性(格式、h 和 w)。

标签: c++ 3d direct3d


【解决方案1】:

“输出合并”是渲染中的关键性能路径之一,因此它一直保持“固定功能”,而现代 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

【讨论】:

    【解决方案2】:

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

    例如,相当常见的一件事,尤其是在广告文案等方面,就是将图像剪裁成某种预定义的形状,例如日落时海边的照片,剪裁成一些文字的轮廓:


    (来源:tipsquirrel.com

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

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

    现在,您确实可以通过其他方式(例如,在像素着色器中)做同样的事情。然而,模板缓冲区比大多数替代方案更快、更便宜也是事实。还有一个历史事实是模板缓冲区几乎永远存在——比可编程着色器之类的东西要长得多。

    【讨论】:

    • 我明白了。你的意思是stencil buffer比可编程shader更早。所以速度更快,但灵活性较差。当我们要实现效果时,我们首先尝试使用stencil。如果是还不够,那么我们考虑使用高级着色器。
    • 还有ARB_shader_stencil_export。不过,一些(较旧的)Nvidia 卡不支持它。
    • Mkay apparently Nvidia 从未实现过它。只有 AMD 和英特尔。
    猜你喜欢
    • 1970-01-01
    • 2011-12-06
    • 2012-03-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-10
    • 2016-01-31
    • 1970-01-01
    相关资源
    最近更新 更多