2

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

我最接近的是使用 glBlendFunc(GL_ONE_MINUS_DST_ALPHA, GL_ONE_MINUS_SRC_ALPHA) 无论有多少图像彼此重叠,它都会保持恒定的不透明度,尽管如果图像相互重叠,不透明度会略有不同。

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

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

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

我正在使用 cocos2d iphone v. 0.99

4

2 回答 2

2

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

这是 pre-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

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

于 2010-03-07T18:36:36.060 回答
0

我最终这样做了:

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

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

于 2010-03-07T22:08:32.913 回答