c++ - Stencil Buffer 有什么用?

标签 c++ 3d direct3d

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

不过,我觉得它能实现的效果,总能用一个普通的buffer来实现。 当我们使用渲染到纹理,并将其用作着色器资源 View 时,将其输入到像素着色器。 然后判断并决定是否手动裁剪该像素。 代码是这样的: 如果(比较值) 剪辑(0); 由于stencil buffer可以用common buffer代替,所以我们还是用它。 那能不能用图形硬件的加速?(一些特殊说明)

最佳答案

“输出合并”是渲染中的关键性能路径之一,因此它一直保持“固定功能”,而现代 GPU 的许多其他方面已经变得可编程。除了可以使用 alpha 混合进行的测试类型之外,您还可以在同一 channel 中对模板数据进行类似的测试:

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 .

关于c++ - Stencil Buffer 有什么用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38214979/

相关文章:

ios - 为什么空 SceneKit 场景具有高多边形数?

opengl-es - 在 Symbian^3 中通过 VBO 方法加载 3D 对象时获取 KERN-EXEC 3,为什么?

c++ - Direct3D Sprite->SetTransform 用法?

graphics - 使用 Direct3D 时,CPU 上执行了多少数学运算?

c++ - 将文本绘制到 IDirect3DSurface9

c++ - 相同的线程 ID

c++ - 并行计算大 vector 的总和

c++ chrono意外行为

c++ - 如何使用CreateDIBSection在BITMAPINFO中写入颜色数据?

ios - 创建带有图层和可点击边的 3D 立方体 - Objective-C