【问题标题】:OpenGL: Overlay one texture over another and suppress white backgroundOpenGL:将一个纹理覆盖在另一个纹理上并抑制白色背景
【发布时间】:2011-03-08 02:49:41
【问题描述】:

我是Iphone opengl ES 编程的初学者。我有两个纹理,第一个是背景并占据全屏。我在第一张图片上打印第二张图片,但第二张图片的白色背景覆盖了部分背景。我希望在前景图片没有颜色(或白色)的地方可以看到背景。我无法弄清楚如何正确使用 glBlendFunc。

在打印第二张图像之前,我正在使用以下混合:

glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); glColor4f(1.0f, 1.0f, 1.0f, 1.0f);

图片地址:http://www.flickr.com/x/t/0097002/photos/vjv2010/

【问题讨论】:

  • 确保在渲染之前调用 glEnable(GL_BLEND)。此外,除非您的纹理是透明的,否则您可以使用 alpha 测试来剪切像素而不是 alpha 混合。 Alpha 测试会更快。
  • @SigTerm:我也是这么想的,但 Apple 记录了它会对性能产生不利影响。也许 iPhone 上的混合速度更快?
  • @Stringer Bell:是的,混合速度很慢(你甚至可以通过过度的 alpha 混合让 PC 崩溃),但要使用 alpha,你必须启用 alphaBlend (glEnable(GL_BLEND) ),或启用 alphaTest(glEnable(GL_ALPHA_TEST))。否则,Alpha 通道的效果为零。如果您不需要半透明表面,那么您只需要 alpha 测试。有一种方法可以用 alphatest+dithering 或者 glPolygonStripple 来模拟半透明,但是小屏幕(iPhone)它必然看起来很丑。
  • @SigTerm,关于 glPolygonStripple,它不是 OpenGL-ES AFAIK 的一部分。另一方面,您有 glSampleCoverage 可以用来伪造透明度! khronos.org/opengles/documentation/opengles1_0/html/…

标签: opengl-es background overlay image glblendfunc


【解决方案1】:

我希望背景可见 前景图片没有的地方 颜色(或白色)。

您有两个选择,最简单的一个是使用 alpha 测试并为前景图像添加一个 alpha 通道,以便每个白色像素(或没有颜色区域)都有一个特殊值,比如说 0.0f 和所有其他 1.0 f.

然后在渲染前景时,您可以使用 glEnable(GL_ALPHA_TEST) 启用 alpha 测试并使用 glAlphaFunc(GL_GREATER, 0.5f) 设置 alpha 函数这将只接受/绘制 alpha 值大于 0.5f 的片段,并丢弃/不绘制所有具有alpha值小于0.5f。

第二个选择是像您一样使用混合,但您还需要向前景添加额外的 Alpha 通道并正确设置 glBlendFunc

更多:http://iphone-3d-programming.labs.oreilly.com/ch06.html

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多