我想知道是否可以在 OpenGL 中擦除任何绘图的一部分?假设我用鼠标画了两条线,这些线在某些点重叠。
是否可以只删除一行?有或多或少简单的方法吗?
OpenGL 不存储您绘制的内容。如果您在 OpenGL 中绘制一条线,那么 OpenGL 将采用该线,对其执行各种数学运算,并将像素写入一个帧缓冲区,从而形成一条线的形状。OpenGL 不记得你画了一条线;OpenGL 所能做的就是将像素写入帧缓冲区。
一般的想法是由 OpenGL 的用户来记住他们绘制的内容。所以如果你画两条线,你应该记住你给这两条线的坐标。因此,如果您想“擦除”一条线,您所做的就是清除屏幕并重新绘制除该线之外的所有内容。
这并不像听起来那么愚蠢。许多 OpenGL 应用程序都在不断地重绘屏幕。它们显示一个帧,绘制一个新帧,然后显示该帧等。这为动画提供了可能性:改变绘制的内容以及从帧到帧的绘制位置。这会产生运动的错觉。
您可以将glLogicOp与 一起使用GL_XOR
,然后重新绘制线条以将其擦除。这不是一个通用的解决方案,但它非常适合传统上使用的选框选择或鼠标工具覆盖。请注意,您需要使用单缓冲,或者在前后缓冲区之间进行复制,而不是交换它们。
如果我理解正确,有两种方法。
仅重绘您需要的元素,每个元素必须有一个布尔值,指示它是否会被绘制。
如果您需要只擦除窗口的一部分,请使用 glScissor。
信息:
现在来点新东西。一个很棒的 GL 命令叫做 glScissor(x,y,w,h)。该命令所做的几乎就是创建您所说的窗口。当启用 GL_SCISSOR_TEST 时,您可以更改的屏幕的唯一部分是剪刀窗口内的部分。
您需要清除缓冲区并重新绘制所需的线条。为此,您可能需要将行数据存储在某种结构中。
You can try stencil buffer techniques. See J. Carmack technique on shadow volumes (inverse stencil or something).