【问题标题】:Constant opacity with glBlendFunc on iPhone在 iPhone 上使用 glBlendFunc 实现恒定不透明度
【发布时间】:2011-01-24 17:32:42
【问题描述】:

我应该使用什么 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

【问题讨论】:

    标签: iphone opengl-es alphablending


    【解决方案1】:

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

    这是 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(QUADS)
    • glColor(100% RGB,部分 alpha)
    • glTexCoord(四次)
    • glVertex(四次)
    • glEnd

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

    【讨论】:

    • 一些代码的机会?我不太明白你的意思。
    • 不幸的是,我无权发布执行此操作的源代码(它使用的是旧版本的 OpenGL,没有渲染缓冲区对象,但想法是一样的),但它几乎与双缓冲。我会将步骤添加到我的答案中。
    【解决方案2】:

    我最终这样做了:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-09-23
      • 2016-03-31
      • 2010-11-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-11-19
      相关资源
      最近更新 更多