【问题标题】:Considering the Stencil in depth深入考虑 Stencil
【发布时间】:2014-07-13 10:45:56
【问题描述】:

我正在使用正交投影来绘制我的对象。 每个对象项都被添加到不同的缓冲区并在几个周期中被绘制。 假设每个对象都有一个轮廓正方形并填充正方形(以不同的颜色)。 所以我先画所有的填充物,然后画轮廓。

我正在使用深度缓冲区来确保轮廓不会覆盖所有填充,如图所示

现在我面临一个问题,即每个对象上都包含另一个绘图项目(例如文本 - 点),它可能比这个正方形更长。所以我使用模板缓冲区在正方形上切割这个额外的绘图。虽然,这样做时没有考虑深度缓冲区。 这意味着一个文本项可以绘制在另一个正方形上。如下图。

有没有办法让它发生?

【问题讨论】:

    标签: webgl depth-buffer stencil-buffer


    【解决方案1】:

    您应该能够将模板缓冲区设置为每个正方形的不同值(假设有 KEEP,从而保留由更靠前但较早绘制的四边形写入的任何模板值。

    这将允许单独剪切每个文本。

    另一种方法是仅使用深度缓冲区并将当前四边形的像素范围传递到文本像素着色器中,您可以在其中丢弃任何额外的像素。这需要较少的状态更改。

    【讨论】:

    • 我有超过 255 个对象,从技术上讲,它们不是正方形 - 它们是纹理图集中的一些纹理 - 就像字体 :) 我想为这个问题简化它。有没有比检查像素着色器中的每个像素是否越界更快的方法?
    • 我不这么认为 - 模板和剪刀测试都需要昂贵的状态更改。然而,像素着色器检查会相对便宜。
    • 你说在着色器中计算和“丢弃”像素比使用模板缓冲区更快吗?是不是这个缓冲区的目的?
    • 如果您必须在绘制单个对象之间更改模板状态,否则这些对象会被批量处理,这将非常昂贵。但是,如果您可以设法有效地剪辑像素着色器,您可能可以用更少的状态更改来做。至少这是我的直觉,您必须对其进行分析。
    • 我已经通过将 DepthTest 更改为 EQUALS 来解决它。现在文本仅在背景位于相同 Z 值上的位置绘制。
    猜你喜欢
    • 1970-01-01
    • 2014-04-19
    • 2017-01-31
    • 2020-03-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多