4

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

是否可以只删除一行?有或多或少简单的方法吗?

4

5 回答 5

9

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

一般的想法是由 OpenGL 的用户来记住他们绘制的内容。所以如果你画两条线,你应该记住你给这两条线的坐标。因此,如果您想“擦除”一条线,您所做的就是清除屏幕并重新绘制该线之外的所有内容。

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

于 2011-06-16T09:07:56.330 回答
1

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

于 2011-06-16T09:12:04.007 回答
0

如果我理解正确,有两种方法。

  1. 仅重绘您需要的元素,每个元素必须有一个布尔值,指示它是否会被绘制。

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

信息:

现在来点新东西。一个很棒的 GL 命令叫做 glScissor(x,y,w,h)。该命令所做的几乎就是创建您所说的窗口。当启用 GL_SCISSOR_TEST 时,您可以更改的屏幕的唯一部分是剪刀窗口内的部分。

于 2011-06-16T09:08:29.813 回答
0

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

于 2011-06-16T09:09:49.357 回答
0

You can try stencil buffer techniques. See J. Carmack technique on shadow volumes (inverse stencil or something).

于 2011-06-16T10:22:51.567 回答