【问题标题】:Blending a texture to erase alpha values softly with OpenGL使用 OpenGL 混合纹理以轻柔地擦除 alpha 值
【发布时间】:2011-05-03 18:17:58
【问题描述】:

我有一个基于 GLPaint 示例代码的小绘图应用程序。它工作正常。 我的问题是我需要实现一个“画笔”来擦除已经绘制的纹理。

我的目标是拥有一个边缘柔软的橡皮擦。现在我只是采用了与绘制相同的纹理,但将混合功能从

glBlendFunc(GL_SRC_ALPHA, GL_ONE);

glBlendFunc(GL_ZERO, GL_ZERO);

结果是一个方形矩形橡皮擦。没关系,但这不是我真正想要的。 我需要柔软的边缘。我想做一个圆形橡皮擦而不是方形矩形。

您有任何猜测如何实现吗? 或者你知道是否有办法创建我自己的自定义混合函数?

【问题讨论】:

标签: iphone opengl-es erase


【解决方案1】:

你知道纹理的背景颜色吗?如果是这样,您可以简单地在其上绘制背景,而不是“擦除”。这会稍微简单一些,因为你只会改变颜色而不是混合模式。

如果您需要混合,请尝试:

glBlendFunc(GL_ZERO, GL_ONE_MINUS_SRC_ALPHA);

这将使用全 alpha 区域中的零,并随着画笔的 alpha 淡出而淡入现有颜色。

此页面包含可能模式的完整列表: http://www.opengl.org/sdk/docs/man/xhtml/glBlendFunc.xml

【讨论】:

  • 背景是一张图片,所以我不能在上面画画。您还有其他解决方案吗?
  • 我建议的混合功能值得一试,如果有的话。如果 GL_ZERO/GL_ZERO 有效,那么使用零和反向 alpha 也应该如此。
  • 我尝试了函数 glBlendFunc(GL_ZERO, GL_ONE_MINUS_SRC_ALPHA),但它甚至无法擦除。
  • 我不知道为什么会这样。如果 GL_SRC_ALPHA, GL_ONE 绘制,则逆 (GL_ZERO, GL_ONE_MINUS_SRC_ALPHA) 应该擦除。特别是因为你说GL_ZERO, GL_ZERO 有效。如果您无法弄清楚,我建议您尝试不同的组合,并使用明显可见的颜色组合对其进行测试。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-04-02
  • 2011-12-14
  • 2019-03-12
  • 2020-04-11
  • 1970-01-01
相关资源
最近更新 更多