Невозможно установить каждый уровень текстуры mipmap вручную - PullRequest
3 голосов
/ 14 октября 2019

Я не могу вручную установить уровни mipmap в opengl. Это не выдает ошибку, но текстура не отображается. Раскомментирование glGenerateMipmap (GL_TEXTURE_2D) работает (означает, что это работает, уровни mipmap не установлены мной).

Кажется, что мои уровни mipmap завершены, так как последний уровень (12) - это изображение 1x1. Любая идея, что я мог бы сделать не так здесь?

Texture::Texture(const std::string texture_levels[]) 
: m_FilePath(texture_levels[0]), m_LocalBuffer(nullptr), m_Width(0), m_Height(0), m_BPP(0)
{

    stbi_set_flip_vertically_on_load(1);
    GLCall(glGenTextures(1, &m_RendererID));
    GLCall(glBindTexture(GL_TEXTURE_2D, m_RendererID));
    GLCall(glTexParameteri(GL_TEXTURE\_2D, GL_TEXTURE_BASE_LEVEL, 0));
    GLCall(glTexParameteri(GL_TEXTURE\_2D, G_TEXTURE_MAX_LEVEL, 12));

    for (int i = 0; i < 13; i++) {
        m_LocalBuffer = stbi_load(texture_levels[i].c_str(), &m_Width, &m_Height, &m_BPP, 4);
            GLCall(glTexImage2D(GL_TEXTURE_2D, i, GL_RGBA8, m_Width, m_Height, 0, GL_RGBA, GL_UNSIGNED_BYTE, m_LocalBuffer));
    }

    GLCall(glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR));
    GLCall(glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR));
    GLCall(glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE));
    GLCall(glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE));

    // glGenerateMipmap(GL_TEXTURE_2D);

    GLCall(glBindTexture(GL_TEXTURE_2D, 0));
    if (m_LocalBuffer)
            stbi_image_free(m_LocalBuffer);
}


Texture::~Texture()
{
    GLCall(glDeleteTextures(1, &m_RendererID));
}

void Texture::Bind(unsigned int slot) const
{
    GLCall(glActiveTexture(GL_TEXTURE0 + slot));
    GLCall(glBindTexture(GL_TEXTURE_2D, m_RendererID));
}

void Texture::Unbind()
{
    GLCall(glBindTexture(GL_TEXTURE_2D, 0));
}

В Main.cpp:


std::string texture_levels[] =
{
    "res/textures/istanbul/01.png",
    "res/textures/istanbul/02.png",
    "res/textures/istanbul/03.png",
    "res/textures/istanbul/04.png",
    "res/textures/istanbul/05.png",
    "res/textures/istanbul/06.png",
    "res/textures/istanbul/07.png",
    "res/textures/istanbul/08.png",
    "res/textures/istanbul/09.png",
    "res/textures/istanbul/10.png",
    "res/textures/istanbul/11.png",
    "res/textures/istanbul/12.png",
    "res/textures/istanbul/13.png"
};



Texture texture(texture_levels);
texture.Bind();

1 Ответ

2 голосов
/ 15 октября 2019

Размер mitmap на уровне должен быть наполовину от размера предыдущего уровня, округленный в меньшую сторону. См. Полнота MipMap .

Более конкретно, размер ширины, высоты или глубины MipMap на уровне i является неотъемлемой частью деления соответствующего размераТекстура изображения по 2^i. Размер последнего уровня mipmap равен 1 для всех измерений, поэтому количество уровней mipmap зависит от размера текстуры и равно log2(maxsize) + 1 (усечено), где maxsize - размерность текстуры с наибольшим размером.

Соответствующая часть в спецификации Спецификация профиля ядра API OpenGL 4.6 - 8.14.3 Mipmapping, стр. 265

...