清除OpenGL中的图形部分

Erase parts of drawings in OpenGL

本文关键字:图形部 OpenGL 清除      更新时间:2023-10-16

我想知道是否可以在OpenGL中擦除任何图形的部分?假设我用鼠标画了两条线,这些线在某些点上重叠。

可以只擦除一行吗?有没有一种或多或少简单的方法?

OpenGL不存储您绘制的内容。如果您在OpenGL中绘制一条线,OpenGL将获取该线,对其执行各种数学运算,并将像素写入形成线形状的帧缓冲区。OpenGL不记得你画了一条线;OpenGL所能做的就是将像素写入帧缓冲区。

一般的想法是,OpenGL的用户可以记住他们画的东西。所以如果你画两条线,你应该记住你给这两条线的坐标。因此,如果你想"擦除"一行,你要做的就是清除屏幕并重新绘制除该行之外的所有

这并不像听起来那么愚蠢。许多OpenGL应用程序不断地重新绘制屏幕。它们显示一个帧,绘制一个新帧,然后显示该帧,等等。这为动画提供了可能性:从一帧到另一帧更改绘制内容和绘制位置。这就产生了运动的错觉。

您可以将glLogicOp与GL_XOR一起使用,然后重新绘制线条以将其擦除。这不是一个通用的解决方案,但它非常适合传统使用的字幕选择或鼠标工具覆盖。请注意,您需要使用单个缓冲区,或者在后缓冲区和前缓冲区之间进行复制,而不是交换它们。

如果我理解正确的话,有两个问题。

  1. 只重新绘制所需的元素,每个元素都必须有一个布尔值,指示是否要绘制。

  2. 如果您需要擦除窗口的一部分,请使用glScissor。

信息:

现在来点新东西。一个奇妙的GL命令,叫做glScissor(x,y,w,h)。这个命令所做的是创建一个几乎可以称之为窗口的东西。启用GL_SCISSOR_TEST时,屏幕上唯一可以更改的部分是剪刀式窗口内的部分。

您需要清除缓冲区并重新绘制所需的行。为此,您可能需要将行数据存储在某种结构中。

您可以尝试模具缓冲区技术。参见J.Carmack关于阴影体积的技术(反向模板或其他东西)。