OpenGL-使特定的VBO不在特定的屏幕区域中绘制(GL_SCISSOR_TEST的“反转”)

cld4siwp  于 2022-10-18  发布在  其他
关注(0)|答案(1)|浏览(139)

我试图让一个特定的VBO(顶点缓冲区对象)不在特定的屏幕区域绘制(但在屏幕的其余部分绘制)。
我有两个VBO,必须在屏幕上绘制。它们可以独立出现,VBO1的部分重叠VBO2,VBO1优先于VBO2。当两个对象都被绘制时,我希望VBO2不在重叠区域渲染,而是渲染对象的其余部分。由于VBO2的大小可以更改,因此尝试使用eBOS(元素缓冲区对象)来实现此行为可能会很棘手。
在某种意义上,我正在寻找的是GL_SCISSOR_TEST的逆函数。如果在GL_SCISSOR_TEST中我可以定义一个区域,在该区域中符号只能在内部绘制(而在外部的部分被剪裁),我希望能够定义一个区域,在该区域内不绘制符号(但将绘制该区域外部的符号部分)。
在OpenGL中实现这一点的最佳策略是什么?

fsi0uk1n

fsi0uk1n1#

有几种不同的方法可以实现所需的结果:
对于一般情况,stencil test似乎是一个很好的选择。请注意,您的帧缓冲区需要支持模板缓冲。

  • 用0清除模具缓冲区
  • 使用以下设置绘制VBO1,这些设置将VBO1覆盖的所有像素的模板缓冲区设置为1。如果您需要一个比VBO1更大的范围,请考虑呈现一个特殊的模具形状,并禁用彩色书写,以标记不可绘制区域。
  • glStencilFunc(GL_Always,1,0xFF),
  • glStencilOp(GL_Keep,GL_Keep,GL_Replace)
  • 使用以下设置绘制VBO2,这些设置仅在模板缓冲区的值为0的地方绘制VBO2(也称为VBO1未绘制的地方):
  • glStencilFunc(GL_EQUAL,0,0xFF),
  • glStencilOp(GL_Keep,GL_Keep,GL_Keep);

如果VBO仅包含平行于屏幕平面的二维对象(如精灵),则还可以使用深度测试并将VBO2渲染到比VBO1更远的位置。
如果您有更特殊的情况,如矩形(如Siccor测试所建议的,该测试仅适用于矩形区域),也可以将VBO1矩形的边界传递给VBO2的片段着色器,并在碎片落在边界区域内时将其丢弃。

相关问题