在iPhone上使用glBlendFunc持续不透明度

时间:2010-03-07 17:56:40

标签: iphone opengl-es alphablending

我应该使用什么glBlendFunc来确保我的绘图的不透明度始终相同?当我使用glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA)并且多个图像相互重叠时,结果会越来越不透明,直到它在一定数量的imga之后完全不透明。

我最接近的是使用glBlendFunc(GL_ONE_MINUS_DST_ALPHA,GL_ONE_MINUS_SRC_ALPHA),无论有多少图像在彼此之上,它都保持恒定的不透明度,尽管如果图像彼此重叠,则不透明度会有轻微变化。 / p>

我应该考虑尝试其他渲染状态吗?还有其他想法吗?我正在为我的孩子制作一个绘图应用程序,我不希望他们绘制的图像(画笔)掩盖背景。

这是我得到的最接近的人:
ImageShask http://img43.imageshack.us/img43/5347/img0085f.png

我想拥有它,以便圆圈的重叠部分与圆圈的中心部分具有相同的颜色和不透明度。

我正在使用cocos2d iphone v.0.99

2 个答案:

答案 0 :(得分:2)

将(无透明度)绘制到渲染缓冲区中,然后将生成的图像用作主场景中部分透明四边形的纹理。

以下是预RBO OpenGL的方法,但不确定您的设备是否支持它,您可能需要将其转换为使用RBO。

  • 确保选择具有至少一个AUX缓冲区的显示格式
  • glGenTextures分配纹理ID
  • glPushAttrib(GL_COLOR_BUFFER_BIT)
  • glDrawBuffer(AUX0)将渲染定向到屏幕外位图
  • glReadBuffer(AUX0)
  • glCopyTexSubImage2D将图像转换为纹理
  • glPopAttrib(GL_COLOR_BUFFER_BIT)恢复绘制缓冲区设置
  • glEnable(Texture_2D)
  • glBindTexture
  • 在glBegin(四边形)
  • glColor(100%RGB,部分alpha)
  • glTexCoord(四次)
  • glVertex(四次)
  • glEnd

请注意,您可以为多个帧重复使用相同的纹理而不必每次都重新渲染它,您也可以通过创造性地使用纹理坐标到四顶点映射来进行一些旋转或拉伸。

答案 1 :(得分:0)

我最终这样做了:

glAlphaFunc(GL_NOTEQUAL, 0);
[sprite1.texture setAliasTexParameters];
[sprite1 setBlendFunc: (ccBlendFunc) { GL_SRC_ALPHA, GL_ZERO }];

然后,当我绘制到我的CCRenderTexture时,我启用alpha测试,访问我的画笔精灵然后禁用alpha测试。