Как сделать несколько текстур?

0

Я пытаюсь понять, как отображать несколько текстур для разных объектов в OpenGL. Я решил просто попробовать, насколько я знаю, glActivate используется для выбора правильной текстуры, но она не работает, как я ожидал. В моем коде показаны два объекта (по очереди), но они имеют одинаковую текстуру. Это часть инициализации текстуры кода:

bool (some args, unsigned int textureUnit, bool wrap)
{
    // some code

    OpenGL->glActiveTexture (GL_TEXTURE0 + textureUnit);
    glGenTextures (1, &textureID);
    glBindTexture (GL_TEXTURE_2D, textureID);
    glTexImage2D (GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, GL_BGRA, GL_UNSIGNED_BYTE, targaImage);

    if (wrap) {
        glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
        glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
    } 
    else {
        glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP);
        glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP);
    }

    glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
    glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);
    OpenGL->glGenerateMipmap (GL_TEXTURE_2D);
}

textureUnit - 0 для первой текстуры, а 1 для второй. Код рендеринга модели:

{
    OpenGL->glBindVertexArray (vertexArrayId);
    glDrawElements (GL_TRIANGLES, indexCount, GL_UNSIGNED_INT, 0);
}

Помещение glActive между этой частью или до этой части ничего не меняет. Итак, мой вопрос: как визуализировать несколько текстур? Должен ли я помещать glActivate в другое место или мне нужно что-то изменить.

Теги:
opengl
opengl-4

1 ответ

2
Лучший ответ

Здесь есть некоторые недоразумения, вызовы glActiveTexture предназначены для управления несколькими текстурами при рисовании одного и того же объекта. Для разных объектов вы просто связываете другую текстуру. Просто удалите свой вызов ActiveTexture при настройке текстур (или убедитесь, что он всегда на 0, когда вы рисуете). Затем при рисовании:

{
    OpenGL->glBindVertexArray (vertexArrayId);
    glBindTexture(GL_TEXTURE_2D, textureID);     /* this has to be set somehow */
    glDrawElements (GL_TRIANGLES, indexCount, GL_UNSIGNED_INT, 0);
} 
  • 0
    Значит, glActivate для нескольких текстур на одном объекте?
  • 1
    @ Правильно. Изменение текстур между объектами осуществляется путем их привязки. glActiveTexture устанавливает, на какое «расположение текстуры» влияют вызовы glBindTexture, но, поскольку вы используете только одну текстуру на объект, вы можете спокойно проигнорировать ее.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню