在使用opengl iphone的cocos2d的透明png纹理

时间:2011-08-25 18:09:35

标签: iphone opengl-es cocos2d-iphone transparent

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

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作为纹理时,我得到一些奇怪的结果。透明区域不是黑色,而是一些黑色的随机颜色。这是我用上面代码得到的输出。

transparent png

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

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

我的问题是,为什么我在透明区域看到这种随机颜色,有什么方法可以解决这个问题?我有一种感觉,因为我不熟悉opengl,所以我必须做错事。

1 个答案:

答案 0 :(得分:2)

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

否则,您可以对GL_GREATER使用alpha测试,0.0(如果使用opengl es 2.0,则在片段着色器中使用discard关键字)。

但是在ios上,alpha测试的效果不如alpha混合。