Opengl es OpenGL:将一个纹理覆盖在另一个纹理上并抑制白色背景

Opengl es OpenGL:将一个纹理覆盖在另一个纹理上并抑制白色背景,opengl-es,background,overlay,image,glblendfunc,Opengl Es,Background,Overlay,Image,Glblendfunc,我是Iphone opengl ES编程的初学者。我有两种纹理,第一种是背景,占据了整个屏幕。我正在第一张图片的顶部打印第二张图片,但是第二张图片的白色背景覆盖了部分背景。我希望背景是可见的,前景图片没有颜色(或白色)。我不知道如何正确使用glBlendFunc 在打印第二幅图像之前,我正在使用以下混合: glBlendFunc(GL_SRC_ALPHA,GL_ONE_减去GL_SRC_ALPHA); glColor4f(1.0f、1.0f、1.0f、1.0f) 图片位于: 我希望背景是可见的

我是Iphone opengl ES编程的初学者。我有两种纹理,第一种是背景,占据了整个屏幕。我正在第一张图片的顶部打印第二张图片,但是第二张图片的白色背景覆盖了部分背景。我希望背景是可见的,前景图片没有颜色(或白色)。我不知道如何正确使用glBlendFunc

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

glBlendFunc(GL_SRC_ALPHA,GL_ONE_减去GL_SRC_ALPHA); glColor4f(1.0f、1.0f、1.0f、1.0f)

图片位于:

我希望背景是可见的 其中前景图片没有 颜色(或白色)

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

然后,在渲染前景时,使用
glEnable(GL_alpha_测试)
启用alpha测试,并使用
glAlphaFunc(GL_更大,0.5f)
设置alpha函数,这将只接受/绘制alpha值大于0.5f的片段,并放弃/不绘制alpha值小于0.5f的所有片段

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

详情如下:

我希望背景是可见的 其中前景图片没有 颜色(或白色)

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

然后,在渲染前景时,使用
glEnable(GL_alpha_测试)
启用alpha测试,并使用
glAlphaFunc(GL_更大,0.5f)
设置alpha函数,这将只接受/绘制alpha值大于0.5f的片段,并放弃/不绘制alpha值小于0.5f的所有片段

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


更多信息:

在渲染任何内容之前,请确保调用glEnable(GL_BLEND)。此外,除非纹理是半透明的,否则可以使用alpha测试来剪切像素,而不是alpha混合。阿尔法测试会更快。@SigTerm:我也这么想,但苹果公司证明它会对性能产生负面影响。。也许iPhone上的混合速度更快?@Stringer Bell:是的,混合速度相当慢(你甚至可以用过多的alpha混合将PC压垮),但要使用alpha,你必须启用alphaBlend(glEnable(Glu BLEND)),或者启用alphaTest(glEnable(Glu alpha_TEST))。否则,alpha通道将没有效果。如果你不需要半透明的表面,alpha测试就是你所需要的。有一种方法可以用alphatest+抖动或GLPolygontripple模拟半透明,但是小屏幕(iPhone)看起来一定很难看。@SigTerm,关于GLPolygontripple,它不是OpenGL ES AFAIK的一部分。另一方面,你有glSampleCoverage,可以通过伪造透明度来使用它!确保在渲染任何内容之前调用glEnable(GL_BLEND)。此外,除非纹理是半透明的,否则可以使用alpha测试来剪切像素,而不是alpha混合。阿尔法测试会更快。@SigTerm:我也这么想,但苹果公司证明它会对性能产生负面影响。。也许iPhone上的混合速度更快?@Stringer Bell:是的,混合速度相当慢(你甚至可以用过多的alpha混合将PC压垮),但要使用alpha,你必须启用alphaBlend(glEnable(Glu BLEND)),或者启用alphaTest(glEnable(Glu alpha_TEST))。否则,alpha通道将没有效果。如果你不需要半透明的表面,alpha测试就是你所需要的。有一种方法可以用alphatest+抖动或GLPolygontripple模拟半透明,但是小屏幕(iPhone)看起来一定很难看。@SigTerm,关于GLPolygontripple,它不是OpenGL ES AFAIK的一部分。另一方面,你有glSampleCoverage,可以通过伪造透明度来使用它!