我想知道关于在延迟渲染上下文中使用模板缓冲区的一件事:屏幕空间上的所有片段着色器是否都在“遮挡”区域内使用?
这是网站http://www.learnopengl.com/#!Advanced-OpenGL/Stencil-testing的示例(只是模板缓冲区主题,与延迟渲染无关):
问题:这里的“其他人被丢弃”是什么意思?这意味着在掩码采样器中的值为 0 的情况下不会调用任何像素着色器,或者对于屏幕上的每个片段,将调用像素着色器但如果值为 0,则将应用一个条件来丢弃像素的填充?
让我们假设左边的第一张图片是没有模板缓冲的结果。信息的支持是由 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 调用仅与彩色区域相关的片段着色器!(这意味着我们不进入片段着色器的主要部分)。在这种情况下,使用的片段着色器的数量将大大减少,并且性能会更好!或者唯一的解决方案是像我上面提到的那样在片段着色器中设置一个条件?