Использование mipmaps приводит к текстурам мусора - PullRequest
2 голосов
/ 19 февраля 2011

Я создаю свои собственные мипмапы при создании текстур, и как только я включаю мипмапы через GL_LINEAR_MIPMAP_NEAREST (или что угодно, MIPMAP), текстуры - это просто очень темный, размытый беспорядок.Если я переключусь на GL_LINEAR, все в порядке.

Вот как я создаю текстуру:

glGenTextures(1, &m_TextureId);
glBindTexture( GL_TEXTURE_2D, id );
int level = 0;

jobject mippedBitmap = srcBitmap;

while (width >= 2 && height >= 2) {
    jniEnv->CallStaticVoidMethod(s_GLUtilsClass, s_texImage2DMethodID,
                     GL_TEXTURE_2D, level, mippedBitmap, 0);

    width >>= 1;
    height >>= 1;
    level++;

    mippedBitmap = createScaledBitmap(jniEnv, srcBitmap, width, height, true);
}

Я пропустил все вызовы Bitmap.recycle () / NewGlobalRef ()для краткости.createScaledBitmap, очевидно, является вызовом JNI для Bitmap.createScaledBitmap ().

Я также пробовал другую версию texImage2D, которая принимает формат и тип растрового изображения.Я убедился, что это всегда RGBA.

РЕДАКТИРОВАТЬ: Чтобы уточнить текстуры - они действительно почти черные.Я попробовал eraseColor () на мипах с яркими цветами, и они все еще очень темные.

Ответы [ 3 ]

2 голосов
/ 20 февраля 2011

Код, который вы показываете, не будет генерировать более низкие уровни MIP (например, будет отсутствовать 1x1), поэтому ваша текстура будет неполной. Это должно сделать рендеринг таким, как если бы текстур вообще не было. Из вашего описания неясно, наблюдаете ли вы за этим.

Во всех случаях вы должны предоставлять мип-карты вплоть до 1x1 (а для неквадратных текстур это требует некоторых изменений в вычислении нового размера текстуры для продолжения передачи 1, как в 4x1 -> 2x1 - > 1x1)

2 голосов
/ 20 февраля 2011

glGenerateMipmap выполнит эту задачу быстрее и намного удобнее для вас.

0 голосов
/ 19 февраля 2011

Может случиться, что Bitmap.createScaledBitmap не исправляет гамму. Посмотрите на этот поток для кода для создания mipmaps с гамма-коррекцией

...