【问题标题】:Android OpenGL ES texture colors show up correctly on emulator but not on phoneAndroid OpenGL ES 纹理颜色在模拟器上正确显示,但在手机上不正确
【发布时间】:2012-01-12 10:24:58
【问题描述】:

我有一个问题,我使用的任何纹理的颜色都被漂白了,如果用这个词来描述它的话,在两部不同的手机上,但纹理在模拟器上显示得很好。

Here are the images. 第一个图像是我正在使用的纹理。 第二张图片是纹理在模拟器上的显示方式以及它应该在手机上的显示方式。 第三张图片是纹理在手机上的实际显示方式。

我应该在我绘制矩形的地方包含代码吗?矩形只是一个顶点缓冲区和 texcoord 缓冲区。实际上对纹理所做的任何事情都是 gl.glBindTexture 和 gl.glBlendFunction(GL10.GL_ONE, GL10.GL_ONE_MINUS_SRC_ALPHA)。 gl.glColor4f(1.0f, 1.0f, 1.0f, 1.0f) 也被调用。

以下代码是我认为可能存在错误的地方。我希望有人可以在这里帮助我。谢谢!

这是在我的 GLSurfaceView.Renderer 实现中

@Override
public void onSurfaceCreated(final GL10 gl, final EGLConfig config) {
    DebugLog.d("onSurfaceCreated");

    gl.glHint(GL10.GL_PERSPECTIVE_CORRECTION_HINT, GL10.GL_FASTEST);
    gl.glShadeModel(GL10.GL_FLAT);

    gl.glDisable(GL10.GL_DEPTH_TEST);
    gl.glDisable(GL10.GL_DITHER);
    gl.glDisable(GL10.GL_LIGHTING);
    gl.glDisable(GL10.GL_MULTISAMPLE);

    gl.glEnable(GL10.GL_BLEND);
    gl.glEnable(GL10.GL_CULL_FACE);
    gl.glEnable(GL10.GL_TEXTURE_2D);

    gl.glEnableClientState(GL10.GL_TEXTURE_COORD_ARRAY);
    gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);

    gl.glFrontFace(GL10.GL_CW);
    gl.glCullFace(GL10.GL_BACK);
}

这是在我的 BitmapTexture 类中。

@Override
public void loadBitmapToHardware(final GL10 gl) throws IOException {
    final Bitmap bitmap = loadBitmap();

    GLUtils.texImage2D(GL10.GL_TEXTURE_2D, 0, GL10.GL_RGBA, bitmap, GL10.GL_UNSIGNED_BYTE, 0);

    bitmap.recycle();
}

@Override
public Bitmap loadBitmap() {
    InputStream is = null;
    try {
        is = mContext.getAssets().open(mBitmapPath);
        return BitmapFactory.decodeStream(is);
    } catch (final IOException e) {
        DebugLog.e("Failed to load Bitmap in " + this.getClass().getSimpleName() + " from path: " + mBitmapPath, e);
        return null;
    } finally {
        try {
            is.close();
        } catch (final IOException e) {
            e.printStackTrace();
        }
    }
}

@Override
public void loadTexture() throws IOException {
    gl.glGenTextures(1, TEXTURE_CONTAINER, 0);
    mTextureId = TEXTURE_CONTAINER[0];
    gl.glBindTexture(GL10.GL_TEXTURE_2D, mTextureId);

    gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_MIN_FILTER, GL10.GL_LINEAR);
    gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_MAG_FILTER, GL10.GL_LINEAR);
    gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_WRAP_S, GL10.GL_CLAMP_TO_EDGE);
    gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_WRAP_T, GL10.GL_CLAMP_TO_EDGE);
    gl.glTexEnvf(GL10.GL_TEXTURE_ENV, GL10.GL_TEXTURE_ENV_MODE, GL10.GL_MODULATE);

    loadBitmapToHardware();
}

【问题讨论】:

    标签: android opengl-es render textures


    【解决方案1】:

    对我来说,这似乎是一个过度曝光的问题。模拟器和手机的屏幕设置可能会以不同方式处理此问题,尤其是在您的代码中禁用了抖动的情况下。

    您应该尝试:
    1:删除 glColor4f() 调用,看看它是否有效(根据我对 GL10 的了解,它在您的情况下将颜色设置为白色,这可能会导致混合问题)。

    2:打开混合并打开深度测试,看看你的混合是否给出了这个结果。

    【讨论】:

    • 谢谢!在您的帮助下,我找到了错误的根源。我创建了一个用于纹理的颜色类,其中一个构造函数将 Android Color 整数转换为 rgba 浮点值以用于 GL。来自 Color 的 rgba 值超出 255 而不是 1。所以我能够通过在我的颜色类的构造函数中添加适当的划分来修复它。非常感谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-06
    • 1970-01-01
    • 2014-07-28
    • 1970-01-01
    相关资源
    最近更新 更多