如何使用模板缓冲区仅屏蔽位于另一个对象后面的对象像素?

Posted

技术标签:

【中文标题】如何使用模板缓冲区仅屏蔽位于另一个对象后面的对象像素?【英文标题】:How do I use the stencil buffer to mask only the object pixels that are BEHIND another object? 【发布时间】:2015-07-04 07:31:24 【问题描述】:

我有两个对象,我们称它们为 Mask 和 Masked。我想使用 Mask 的形状在 Masked 中“切一个洞”。到目前为止,我已经能够设置一个非常简单的测试,它呈现如下所示: http://i.imgur.com/CjkUfvW.png

很遗憾,这个遮罩没有考虑到遮罩的 Z 深度。

我希望看到的是这样的: http://i.imgur.com/LGPmr3f.png

为了澄清,Mask(球体)与 Masked(立方体)相交,但球体的完整形状被用作模板,而不仅仅是未被立方体遮挡的像素。

这是我的球体 Stencil 通行证:

    ColorMask 0
    ZWrite off
    Pass
        Stencil 
            Ref 1
            Comp always
            Pass replace
        

这是我的立方体 Stencil 通行证:

    Stencil 
        Ref 1
        Comp notequal
    

问题似乎在于球体没有通过深度测试,这是有道理的,因为它是渲染队列中的第一个(“Queue”=“Geometry-1”)。关于我可以尝试什么来完成这项工作的任何想法?

【问题讨论】:

【参考方案1】:

本质上,您需要从立方体中使用 Z 测试切割球体,并且您需要从球体中使用模板测试切割立方体。这个鸡蛋问题可能可以通过你的立方体中的另一个“通行证”来解决。使其首先在队列“Geometry-2”中使用 ColorMask 0 写入。然后,像往常一样渲染你的球体。并将当前的多维数据集传递更改为 ZTest with Equal。

【讨论】:

以上是关于如何使用模板缓冲区仅屏蔽位于另一个对象后面的对象像素?的主要内容,如果未能解决你的问题,请参考以下文章

OpenGL如何在模板测试失败且深度测试成功时写入模板缓冲区?

使用模板缓冲区概述对象会给出错误的结果

webGL - 如何在帧缓冲区旁边设置模板缓冲区并使用它?

如何将鼠标事件调用到 javascript 中位于其他对象后面的 dom 对象?

OpenGL:清除模板缓冲区,除了某些位?

在 iO 中使用 Open GL 1.0 模板缓冲区进行屏蔽的问题