在cocos2d中使用opengl iphone的透明PNG纹理

我在cocos2d框架中使用opengl创建了一个填充纹理的多边形。 我已经使用PRKit(链接)并修改了下面显示的代码的绘制方法。

glBlendFunc(GL_ONE, GL_ZERO);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
glBindTexture(GL_TEXTURE_2D, self.texture.name);
glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_DECAL);
glVertexPointer(2, GL_FLOAT, 0, polyTriangulatedPoints);
glTexCoordPointer(2, GL_FLOAT, 0, textureCoordinates);
glDrawArrays(GL_TRIANGLES, 0, trianglePointCount);
glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);

当我使用透明PNG作为纹理时,我得到了一个奇怪的结果。 透明区域不是黑色,而是一些随机的颜色与黑色。 这是我用上面的代码得到的输出。

我必须保持glBlendFunc(GL_ONE,GL_ZERO),这与禁用混合相同。 如果我不这样做,cocos2d中的背景图层会与我的纹理图像一起添加,从而产生非常明亮的纹理。 为了添加更多的信息,我已经设置了纹理模式,以便所有图像都加载了以下内容。

glTexImage2D(GL_TEXTURE_2D,0,GL_RGBA,width,height,0,GL_RGBA,GL_UNSIGNED_BYTE,data);

我的问题是,为什么我会在透明区域看到这种随机颜色,以及如何解决这个问题? 我有一种感觉,因为我对opengl很陌生,所以我一定在做错事。


如果具有完全不透明/全透明像素(仅alpha = 1.0或0.0)的纹理,则可以保留GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA以保持透明度。

否则,您可以使用GL_GREATER的alpha测试0.0(或者如果使用opengl 2.0,则丢弃片段着色器中的关键字)。

但在ios上,alpha测试比alpha混合性能低。

链接地址: http://www.djcxy.com/p/34001.html

上一篇: Transparent png texture in cocos2d using opengl iphone

下一篇: Animated GIF on iPhone using OpenGL and GifLib