【问题标题】:Producing eraser effects using libgdx and OpenGL ES使用 libgdx 和 OpenGL ES 制作橡皮擦效果
【发布时间】:2012-05-09 13:43:48
【问题描述】:

请考虑以下图片作为说明:

最初我用单个图像填充整个屏幕/舞台,直到屏幕变成粉红色。每一个粉红色的斑点都是我添加到舞台上的一个单独的 Image actor。

现在我想以这样一种方式实现 touchDown 方法,即每次用户触摸屏幕时,它都会擦除发生触摸事件的图像的一部分。但是,该触摸事件不应影响粉红色 blob 演员后面或之上的其他图像/演员/纹理区域。我应该如何使用 OpenGL ES 在 libgdx 中实现这一点?请在这方面帮助我。

我找到了这个链接,它解释了如何修改 TextureRegion,但我不知道如何使用这个博客中解释的技术来解决我的问题。 Here is the link

【问题讨论】:

  • 在触摸时,是否要“擦除”整个图像?擦除是否意味着将白色值写入像素,或使它们透明?您使用的是 OpenGL ES 2? libgdx 似乎支持它。
  • @StefanHanke 不。我打算只擦除发生触摸事件的图像的一部分。我想让它们透明而不是把它们涂成白色,这样背景就变得可见了。
  • 如果你知道现在要擦除哪种颜色会更容易..
  • @userSeven7s 好的,如果我知道要擦除的颜色是什么,那我该怎么做呢?

标签: android opengl-es libgdx pixmap


【解决方案1】:

你能使用 FBO 和模板缓冲区吗?

为您的“粉红色”图层设置 FBO 并为其设置模板缓冲区。触地时,将您的触感绘制为粉红色 FBO 模板缓冲区的遮罩。现在,当您绘制粉红色 FBO 时,您触摸的区域不会被渲染,因此您将能够看到它背后的背景 FBO。

此链接http://www.opengl.org/archives/resources/faq/technical/rasterization.htm,第 14.050 节告诉您如何设置模板缓冲区:

您可以如下设置OpenGL状态:

glEnable(GL_STENCIL_TEST);
glStencilFunc(GL_ALWAYS, 0x1, 0x1);
glStencilOp(GL_REPLACE, GL_REPLACE, GL_REPLACE);

随后的渲染将在模板缓冲区中为每个 像素渲染。

你可能不得不摆弄一些东西,这样你的遮罩就会以正确的方式出现(你触摸过的地方,而不是你没有触摸过的地方。)

【讨论】:

  • 三个堆叠(XYZ)的想法正是我想要的。既然您在这里讨论缓冲区,那么操作是否足够平滑以至于不会导致渲染线程产生明显的抖动?由于我对 OpenGL ES 比较陌生,所以我不知道缓冲区是如何工作的,所以我必须从头开始尝试。问题是我必须确定这种方法最适合我在这里想要做的事情。就 FBO 和模板缓冲区而言,是的,我可以使用它们,但我不知道如何使用。以下是框架内 FBO 和模板缓冲区的一些参考资料。
  • 现在我想多了,你真的不需要三个 FBO,只需要一个带有模板缓冲区来匹配。我已将问题编辑为更好。这个答案有一些关于 FBO 性能stackoverflow.com/a/2203931/959304 的东西,但我会在它工作之前忽略性能,如果性能变差,然后支付额外的代码复杂性,当你想要优化时。
  • 好的,所以整个想法是在纹理上设置缓冲区并修改这些纹理的各个像素。我说的对吗??
  • 是的,我猜。 FBO 可以被认为是一个纹理,它只是更容易和更快地修改 FBO 的内容,因为您只需使用常规的 opengl 绘图方法而不是修改绑定的纹理。您仍然会将图像(作为纹理)绘制到 fbo 中,但是当您绘制 FBO 时,您会使用模板缓冲区屏蔽掉其中的某些区域。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-27
  • 2014-08-18
相关资源
最近更新 更多