Текстуры выглядят размытыми, когда загружается не последний - PullRequest
2 голосов
/ 14 мая 2019

Я пытаюсь загрузить несколько текстур (майнкрафт) и применить их к кубам.Я загружаю текстуры с SOIL:


GLuint loadTex(const char * path)
{
    GLuint image = SOIL_load_OGL_texture // load an image file directly as a new OpenGL texture
    (
        path,
        SOIL_LOAD_AUTO,
        SOIL_CREATE_NEW_ID,
        SOIL_FLAG_MIPMAPS | 
        SOIL_FLAG_INVERT_Y | 
        SOIL_FLAG_TEXTURE_REPEATS | 
        //SOIL_FLAG_MULTIPLY_ALPHA |
        SOIL_FLAG_NTSC_SAFE_RGB | 
        SOIL_FLAG_COMPRESS_TO_DXT
    );

    if (!image)
    {
        printf("SOIL loading error: '%s'\n", SOIL_last_result());
    }

    std::cout << "texId: " << image << std::endl;
    return image;
}

Я тестирую его, загружая 2 разные текстуры (и они получают разные идентификаторы).Я передаю эти текстуры функции, которая создает куб с заданным идентификатором текстуры:

GLuint createTexturedCube(GLuint texId)
{
    GLuint index = glGenLists(1);
    glNewList(index, GL_COMPILE);
        glPushMatrix();
        glEnable(GL_TEXTURE_2D);

        glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE);
        glBindTexture(GL_TEXTURE_2D, texId);

        glBegin(GL_QUADS);

        glNormal3f(0, 1, 0);
        glTexCoord2f(1, 1); glVertex3f(0.5f, 0.5f, -0.5f);
                ...
}

Я загружаю две текстуры и создаю два куба.Выход из SOIL показывает, что это id 1 и 2, но когда я рисую кубы, правильно показывает только последняя загруженная текстура.Другой кажется немного размытым.

Результат здесь:

Блок слева - последняя загруженная текстура, справа - первая текстуразагружен.Так происходит с любым количеством текстур, всегда последняя является правильной.

Я пытался использовать glActiveTexture, но это вызывает исключение (segfault пытается получить доступ к # 0000000)

Мои настройки текстуры следующие:

        glEnable(GL_BLEND);
    glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);

    glEnable(GL_ALPHA_TEST);
    glAlphaFunc(GL_GREATER, 0.1);

    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER,
        GL_NEAREST);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER,
        GL_NEAREST);

1 Ответ

4 голосов
/ 14 мая 2019

glTexParameteri не изменяет глобальные настройки (или настройки объекта сэмплера).
glTexParameter устанавливает параметры объекта текстуры, который в настоящее время привязан к указанной цели.
Вы должны установить параметры текстуры для каждого объекта текстуры.

Обратите внимание, начальное значение для GL_TEXTURE_MIN_FILTER равно GL_NEAREST_MIPMAP_LINEAR, а начальное значение для GL_TEXTURE_MAG_FILTER равно GL_LINEAR.
В случае изображения (в вопросе) текстуры увеличиваются.Это приводит к размытому виду объекта с текстурой с неизменными параметрами текстуры.

...