【问题标题】:OpenGLES + Framebuffer artifactsOpenGLES + 帧缓冲工件
【发布时间】:2017-07-12 15:58:58
【问题描述】:

使用 OpenGLES 1.1(此时别无选择)。目标操作系统是 Android。

渲染到主帧缓冲区和渲染到纹理时出现一些不一致。

当我渲染到正常屏幕时,一切都很好。当我渲染到纹理时,无论 alpha 是半透明的,我的图形周围都会出现一个深色边缘。

这是我的辅助函数:

void RenderNormal()
{
    if (!gIsRenderToTexture)
    {
        glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA);
        glBlendEquationOES(GL_FUNC_ADD_OES);
    }
    else
    {
        glBlendFuncSeparateOES(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA,GL_ONE,GL_ONE_MINUS_SRC_ALPHA);
        glBlendEquationSeparateOES(GL_FUNC_ADD_OES,GL_FUNC_ADD_OES);
    }
}

void RenderAdditive()
{
    glBlendFunc(GL_SRC_ALPHA, GL_ONE);
}

void RenderMultiply()
{
    glBlendFunc(GL_ZERO, GL_SRC_COLOR);
}

所以,一些数据:

  • 在较新的系统上,这工作得很好(也适用于 iOS、OSX 和 Linux)
  • 在 Kindle Fire 上,我仍然得到黑框。
  • 在运行 KitKat 的较旧 Android 设备上,我的加法/乘法函数不会关闭(我假设是因为 glBlendFunc 和 glBlendFuncSeparate 之间的杂耍...我没有关闭某些东西,但无论我尝试做什么来修复它使情况变得更糟)

我正在寻找一种方法来对这三个函数求平方,以便它们既可以渲染到纹理,又可以渲染到正常的 ol' 屏幕。你能帮忙吗?

【问题讨论】:

  • 是的...问题似乎在于绘制零 alpha(而不是正常帧缓冲区的 1 alpha)。我在我正在开发的游戏中使用渲染目标作为“层”。另外,请注意,在较新的设备上,它可以工作......所以我怀疑在需要在旧设备上执行的新设备上不需要一些内务管理。
  • 为什么不直接清空到 1.0 alpha?
  • 因为我把它当做透明层……不画的地方我要透明的。

标签: android opengl-es framebuffer render-to-texture opengl-es-1.1


【解决方案1】:

好的,经过一天的工作和研究,我终于发现在目标设备上,不支持 OES。也就是说,任何有这个问题的人...... Kindle Fire 和许多旧平板电脑完全不支持 glBlendFuncSeparateOES 或 glBlendEquationOES,它们会静默失败。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多