Цвета текстуры Android OpenGL ES корректно отображаются на эмуляторе, но не на телефоне - PullRequest
2 голосов
/ 04 декабря 2011

У меня проблема с тем, что цвета любых текстур, которые я использую, обесцвечены, если это хорошее слово для описания, на двух разных телефонах, но текстуры на эмуляторе отображаются очень хорошо.

Вот изображения. Первое изображение - это текстура, которую я использую.Второе изображение показывает, как текстура отображается на эмуляторе и как она должна отображаться на телефонах.Третье изображение - это то, как текстура на самом деле отображается на телефоне.

Должен ли я включить код, где я рисую прямоугольник?Прямоугольник - это просто буфер вершин и буфер 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();
}

1 Ответ

0 голосов
/ 04 декабря 2011

Для меня это выглядит проблемой передержки. Вполне вероятно, что настройки экрана для эмулятора и вашего телефона решают эту проблему по-разному, тем более что в вашем коде отключен дизеринг.

Вы должны попытаться:
1: Удалите вызов glColor4f () и посмотрите, работает ли он (из того, что я знаю о GL10, он устанавливает белый цвет в вашем случае, что может вызвать проблемы с смешиванием).
или
2: включите смешивание и включите проверку глубины, чтобы увидеть, дает ли ваше смешивание этот результат.

...