使用OpenGL和GLSL进行模板缓冲和延迟渲染

时间:2015-06-05 22:35:23

标签: opengl glsl deferred-rendering deferred-shading

我想知道在延迟渲染上下文中使用模板缓冲区的一件事:屏幕空间上的所有片段着色器是否都在“遮挡”区域内使用?

以下是网站http://www.learnopengl.com/#!Advanced-OpenGL/Stencil-testing的示例(仅限模板缓冲区主题,与延迟呈现无关):

enter image description here

问题:“其他人被丢弃”的表达是什么意思?这意味着在掩码采样器中值为0时将不调用任何像素着色器,或者对于屏幕上的每个片段,将调用像素着色器但是如果值为0,则将应用条件丢弃像素的填充? / p>

让我们假设左边的第一张图片是没有模板缓冲的结果。信息的支持是由2个三角形组成的四边形(我们应用延迟渲染技术,因此我们在屏幕空间中工作 - 屏幕的尺寸为500x500)。因此在光栅化之后,将调用500 * 500片段着色器来填充帧缓冲区,并且即使在没有光的暗区域也将使用它们。这意味着如果我们应用一个blinn-phong着色模型,这个最后一个将应用于黑暗区域的屏幕上的任何地方,我认为这对性能来说是浪费。

因此,在这种情况下要做的合乎逻辑的事情应该是创建一个掩码(使用模板缓冲区或使用外部自定义掩码渲染传递使用其他帧缓冲区来填充它)并最终使用blinn-phong着色模型仅举例来说屏幕空间中掩模采样器中像素的值为1.这样,phong着色模型将仅应用于我们的示例中的2个方框和平面上!

这里用于在第一种方法中正确完成工作的技巧应该是在片段着色器中添加一个条件,以告诉我们是否需要根据采样掩码的值计算当前片段的blinn-phong着色质地。

void main(void)
{
    if (texture(MaskSampler, TexCoord.xy).r == 1.0f)
    {
         //Execute here Blinn-Phing shading model...
    }
    //Else nothing
}

但我想知道(如果我们查看上面的第三张图片)是否可以告诉OpenGL API调用仅受彩色区域影响的片段着色器! (这意味着我们不进入片段着色器的主体)。在这种情况下,使用的片段着色器的数量将大大减少,并且为了性能,它会更好!或者唯一的解决方案是在片段着色器中放置一个条件,如上所述?

1 个答案:

答案 0 :(得分:1)

在大多数情况下,模板测试将在片段着色器之前运行,并跳过其执行。详细描述了here,以及在片段着色器之前可能无法执行的条件,尽管这些在您描述的设置中不太可能。这比片段着色器中的其他分支/样本更受欢迎。它的实施和维护也更容易。

然而,在分支的情况下,您提出的运行复杂度较低的着色器的方法也可以提高速度(比如为每个像素运行完整的着色器)。这是因为,大多数现代驾驶员优化了空间相干性的分支预测。这意味着,如果局部区域中的所有像素始终采用相同的分支,则可以对其进行优化。 GPU Gems中的一章描述了这一过程。当然,这高度依赖于着色器复杂性,区域和驱动程序实现。模板方法方法不那么模糊。