我一直在使用LearnOpenGL做OpenGL教程。目前,我正在阅读有关模板缓冲区的信息,在他的示例中,他使用模板缓冲区在对象周围绘制轮廓。我也读过它可以用来创建阴影和反射。我的问题是,模板缓冲区的其他实际用途是什么?为什么首先发明它们?

#1 楼

模板缓冲区的原始用途是用于非3D内容。假设您正在制作3D游戏。屏幕的大部分是3D内容,但外部也有一些GUI,它不是通过OpenGL而是通过2D canvas API绘制的。您可以使用模具缓冲区来掩盖2D GUI的形状,然后确保您的3D / OpenGL内容不会影响它并且不会引起透支(浪费片段着色时间)。

如您所见,它还用于阴影体积和一些反射技术等技术。通常,它可用于您绘制对象然后想要运行另一个片段着色器(或更多绘制调用)以通过添加反射,照明或屏幕空间效果来更改该对象外观的技术。在这种情况下,当您第一次绘制对象时,同时填充模板缓冲区非常便宜。然后,您以后的遍历(添加反射或其他操作)可以使用模板测试仅在最终确实在屏幕上绘制的那些片段上运行。

另一个常见的用法是在多个部分。例如,在飞行模拟器中,驾驶舱(和飞机外部)和地形(和其他飞机)通常在完全独立的通道中完成。这使您可以使用较低精度的深度缓冲区而不会引起z争斗,因为您可以对近距离内容和远距离内容使用不同的深度范围。但是,如果执行此操作,则无法为两次遍历重复使用相同的深度值。在这种情况下,可以在绘制座舱时填充模板缓冲区,并在绘制地形时使用模板测试来避免过度绘制座舱。 (您需要做更多操作来处理驾驶舱窗户上的玻璃效果:此描述过于简单。)您可以使用类似的技术来绘制第一人称射击游戏中玩家的武器和/或手。

模板缓冲区用于许多技术中:太多,无法单独列出它们。但是通常,如果要使某些渲染过程仅影响某些片段,并且要影响的片段是与特定对象或着色器相对应的那些片段,则模板缓冲区是启用它的一种廉价方法。

#2 楼

我认为Dan并没有提到的另一种用法是填充非凸多边形,例如,


模版可用于实现填充规则,通常可以通过将顶点列表视为三角形扇形,或通过重新排序三角形带,然后适当设置模板,将奇数/偶数(在这些示例中使用)或非零。最终,绘制了一个封闭对象,但仅限于那些与适当规则匹配的像素。如果使用非零规则,则有一个问题就是您不想“溢出”最大模具值。

但是,如果要重复绘制相同的多边形(不论是否进行了转换),首先应用三角剖分算法可能会更有效,这样可以消除浪费的透支。 (FWIW提供的图像来自大约十年前我为SVG / OpenVG研究的三角剖分算法。)