【发布时间】: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);
【问题讨论】:
-
确保在渲染之前调用 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