OpenGL: генерация MIP-карты для растрового шрифта делает его темнее при уменьшении масштаба

Я загружаю шрифт из текстуры TGA. Я генерирую MIP-карту, используя функцию gluBuild2DMipmaps().

Когда шрифт имеет определенный размер, это выглядит очень хорошо. Но когда он становится меньше, он становится все темнее и темнее всякий раз, когда достигает нового уровня MIP-карты.

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

void TgaLoader::bindTexture(unsigned int* texture)
{
    tImageTGA *pBitMap = m_tgaImage;

    if(pBitMap == 0)
    {
        return;
    }

    glGenTextures(1, texture);
    glBindTexture(GL_TEXTURE_2D, *texture);

    gluBuild2DMipmaps(GL_TEXTURE_2D,
                        pBitMap->channels,
                        pBitMap->size_x,
                        pBitMap->size_y,
                        textureType,
                        GL_UNSIGNED_BYTE,
                        pBitMap->data);


    glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR_MIPMAP_NEAREST);
    glTexParameterf( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
}   

Это делает текст таким (он должен быть белым):

введите здесь описание изображения

Едва видимый.

Если я изменю GL_TEXTURE_MIN_FILTER, чтобы в основном игнорировать MIP-карты (например, используя GL_LINEAR), это будет выглядеть так:

введите здесь описание изображения

Я пробовал разные параметры фильтра, а также пытался использовать glGenerateMipmap() вместо gluBuild2DMipmaps(), но всегда получал один и тот же результат.

Что не так с кодом?


person Beriol    schedule 14.12.2018    source источник
comment
Проще говоря, при автоматической генерации мипмапа 4 тексела (в квадре) интерполируются и сохраняются на следующем уровне мипмапа с половинным разрешением. Это приводит к тому, что текст становится все темнее и темнее с каждым уровнем. Если вы хотите улучшить результат, вам нужно использовать текстуры с разным размером и текстом, отображаемым в разных размерах, и вы должны загружать эти текстуры на разные уровни мип-карты. Или вы используете такой метод, как поля расстояния   -  person Rabbid76    schedule 14.12.2018
comment
Будет ли достаточно сделать столько текстур, сколько необходимо, разделив текстуру шрифта на 2 с помощью редактора случайных изображений? Так, например, если я начну с 512x512, уменьшу масштаб до 256x256, чтобы сделать mipmap уровня 1, затем 128x128 для уровня 2 и так далее.   -  person Beriol    schedule 14.12.2018