我正在为一款涉及绘画/绘画机制的iPhone游戏开发游戏,但是在尝试创建一种工具来擦除已经绘画过的东西时遇到了问题。

主要问题是,要绘制的背景不是纯色,而是静态图像或动画。我尝试在绘图中使用不同的混合选项和逻辑运算,但似乎没有任何效果。我是OpenGL的新手,所以我必须缺少一些东西。

有什么提示吗?

编辑:要提供更多信息,我正在为笔刷使用纹理,并使用glVertexPointer()和glDrawArrays()渲染它们。例如: 通用标签

编辑2:不幸的是,模板缓冲区在iPhone上不可用。:(

编辑3:在iPhone上可以使用Framebuffer对象,这就是我所走的路。我还没有完全实现它,但是到目前为止,它看起来像我想要的那样工作。谢谢大家!

有帮助吗?

解决方案

在场景上绘制全屏纹理四边形。当用户绘制画笔笔触时,请使用glTexSubImage2D更新您的纹理。

glReadPixels / glDrawPixels很慢。

使用FrameBufferObjects甚至更好,但是我怀疑这种扩展在iPhone上是否可用(再一次,我不确定,所以可以尝试一下)。FBO允许您直接将其绘制到纹理中,就好像它是另一个渲染上下文一样。

其他提示

确定模板缓冲区是确定解决此问题的最佳方法...您将节省时间,CPU和潜在问题。.,它们在Iphone上可用,您只需要创建一个OpenGlES 2.0表面(不是gles 1.0)或1.1)。 通用标签

查找此示例: http://www.opengl.org/resources/code/samples/glut_examples/examples/stenciltst.c

这是视觉效果: http://www.opengl.org/resources/code/samples/glut_examples/examples/stenciltst.jpg

我在Android和iPhone上都使用了相同的橡皮擦工具,它的工作原理就像一个魅力!

祝你好运!

干杯!

您提供的信息不多,但我假设您将将它们“绘制”的所有内容存储到缓冲区中,然后像这样在屏幕上绘制它: 通用标签

使用drawing-> ImageData作为缓冲区。您可以做的是拥有一个单独的后台缓冲区,然后先绘制它。然后,擦除工具将简单地将绘图缓冲区变白(将所有值(包括alpha值)一路调高)。

要使该解决方案有效,您必须打开混合并关闭深度测试 通用标签

这是您要找的吗?

您可以使用模板缓冲区执行此操作。模版缓冲区是一种特殊的缓冲区,用于保存每个像素的信息,类似于深度缓冲区。与深度缓冲区不同,您可以决定在绘制时如何更改模板缓冲区以及它如何影响是否将其拖入颜色缓冲区的决定。为此,您可以在执行任何绘制操作之前设置特定的状态。这是您的工作:

  • 在用户擦除时,将“擦除”区域绘制到 模板缓冲区(使用StencilOp,请参见下文)。您可以使用任何GL绘图 功能。

  • 在每个渲染过程中,首先绘制 背景(如果需要,您可以 在这里使用阴性模板测试 只画出“擦除的”部分 背景-可能会增加 性能)。

  • 然后,为所有启用模板测试 其他绘图操作。的OpenGL 然后只会吸引到 “未擦除”区域。

    用于设置模板缓冲区如何影响图形(或不影响图形)的函数: glStencilFunc()

    用于设置模板缓冲区自身如何受到绘图影响的函数: glStencilOp()

    进一步的解释,也带有这些参数: http://www.opengl.org/resources/代码/样本/sig99/advanced99/notes/node117.html

可以使用glBlendFunc(GL_ONE,GL_ZERO)模式进行操作。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top