Android 上的 OpenGL 工件渐变

OpenGL Artifact Gradient on Android

我遇到了一些 android 设备的问题,如下图所示。

我是运行我自己用opengl和c++设计的渲染引擎,我在Mac、Windows、IOS和Anroid上渲染同样的东西。只有一个特定的设备,Google Tango 平板电脑,我可以看到神器渐变。我在没有纹理的情况下使用 glsl 进行了尝试,并使用纹理进行了尝试,但无论哪种方式,结果都是一样的。

它是使用混合和纹理选项渲染的纹理。

1.  glBlendFunc(GL_SRC_COLOR,GL_ONE_MINUS_SRC_COLOR);

2.  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);

其他 5 android 台设备对此没有问题。

解决这个问题的最佳方法是什么?

我认为该设备可能具有 565 渲染目标,因此 8888 纹理源最终被量化了。渲染目标的位深度可能设置在 GLSurfaceView.java 中(尽管它可能不取决于您的应用程序所基于的框架)。可以选择更高的位深度,但并非所有设备都支持优于 565 的主要设备。

一个可能的修复方法是使用 glEnable(GL_DITHER) 启用抖动,这会破坏渐变并使其更难被发现。

但是,一旦您的场景中有更多内容,您就会发现渐变伪影无论如何都变得很难发现,因为发生的所有其他事情都会产生噪音。