OpenGLES 2 - когда в glBindTexture и когда glActiveTexture? - программирование
Подтвердить что ты не робот

OpenGLES 2 - когда в glBindTexture и когда glActiveTexture?

Хорошо, так что эти текстуры действительно меня смущают. Я смотрел на этот учебник (который я считаю замечательным), особенно изображение с надписью "Вы можете определить до 32 единиц текстуры, но всего 8 текстур за шейдер.". Как я понимаю, здесь, как это работает:

Вы активируете блок текстуры. Затем вы привязываете объект текстуры (аналогичный кубам "Данные текстуры" на изображении) к определенной цели внутри этого устройства. Итак, glGenTextures, чтобы сделать объекты и получить их имена, а затем glBindTexture, чтобы связать эту текстуру с TEXTURE_2D или что-то (на данный момент меня не интересуют другие цели). Затем вы можете указать данные текстуры с помощью glTexImage2D.

Теперь. Я использую 3 шейдерных программы, каждая из которых требует различных текстур. Вот что я хочу сделать:

На этапе инициализации я просматриваю каждую из своих текстурных единиц и выхожу

  • glActiveTexture
  • glBindTexture (работает с активной текстурной единицей)
  • glTexImage2D (работает с текущим связанным объектом)

а для шейдеров - glUniform, чтобы соответствовать униформе в каждом шейдере к значению "i", указанному в GL_TEXTUREi glActiveTexture. Мне нужно всего четыре текстуры, и они довольно маленькие.

Теперь, во время рендеринга, я должен иметь возможность переключать программы в порядке, и все работает, правильно? У каждой программы уже есть единое целое, указывающее, какой блок использовать, и каждая единица уже имеет объект, привязанный к своей цели TEXTURE_2D, и каждый объект имеет данные, указанные glTexImage2D, правильно? Итак, в моей функции рендеринга не требуется привязка или активация единиц? По крайней мере, так, как я это понял, но я получаю неправильные текстуры в неправильных местах.

Кроме того, в одной из моих программ я хочу переключиться между тремя текстурами для одной поверхности. Поэтому я решил, что загружаю каждую текстуру в объект и привязываю каждый объект к единице, а затем во время рендеринга я могу просто glUniform сообщить программе, какую текстурную единицу использовать.

Итак, мне интересно, не понял ли я фундаментальную структуру текстурирования в OpenGL, или истекает ли привязка объектов к единицам при переключении программ или что-то в этом роде. Или нужно привязать текстуру несколько раз - но когда и почему?

4b9b3361

Ответ 1

Не забудьте установить glTexParameteri для каждого объекта текстуры.

void loadTextures() {
    GLint texture_object_handles[3];
    glGenTextures(3, texture_object_handles);

    for (int i = 0 ; i < 3 ; ++i) {
        glActiveTexture(GL_TEXTURE0 + i);
        glBindTexture(GL_TEXTURE_2D, texture_object_handles[i]);
        glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
        glTexImage2D(GL_TEXTURE_2D, ...);
    }
    return;
}


void draw() {
    // Draw three different materials without rebinding any textures.
    for (i = 0 ; i < 3 : ++i) {
        ... specify other uniforms and attributes
        glUniform1i(texture_location, i);
        ... 
        glDrawElements(...);
    }
    return;
}