связывание буферов несколько раз в openGL - PullRequest
1 голос
/ 14 февраля 2020

При изучении opengl возникает путаница: нужно ли связывать буферы, такие как VAO или идентификаторы текстуры, несколько раз, не снимая их?

Со ссылкой на вышеуказанную ссылку и полный исходный код я натолкнулся на 2 сценария ios, немного отличающихся друг от друга.

Сначала , автор создает VAO (вне maindraw l oop) и связывает VAO, используя glBindVertexArray(VAO), затем он не отменяет привязку используя glBindVertexArray(0);, но он снова связывает его в ландыш oop. Мое замешательство, Это действительно необходимо? Разве в настоящее время связанный ВАО уже ... связан? Зачем связывать его, когда это уже активный VAO?

И,

Секунда , автор создает идентификатор текстуры, используя:

glGenTextures(1, &texture1);
glBindTexture(GL_TEXTURE_2D, texture1);  
//some more code
glGenTextures(1, &texture2);
glBindTexture(GL_TEXTURE_2D, texture2);

вне основного розыгрыша l oop, но делает это снова * внутри основного розыгрыша l oop: *

 glActiveTexture(GL_TEXTURE0);
 glBindTexture(GL_TEXTURE_2D, texture1);
 glActiveTexture(GL_TEXTURE1);
 glBindTexture(GL_TEXTURE_2D, texture2);

Две вещи, которые я не понимаю в что он делает:

  1. Почему он снова связывает идентификатор текстуры в mainl oop, когда он сделал это вне mainl oop? (Этот похож на VAO, но я пока не знаю, возможно ли здесь отключение привязки)
  2. Почему он выбирает активную текстурную единицу (используя glActiveTexture) внутри l oop? Разве это не может быть сделано вне основного розыгрыша l oop?

1 Ответ

2 голосов
/ 14 февраля 2020

glBindTexture привязывает текстуру к указанной цели и текущему текстурному блоку. Текущий текстурный блок устанавливается glActiveTexture. Текущий текстурный блок является глобальным состоянием, и glBindTexture считает это состояние.

Это измеряется, когда вы делаете

glBindTexture(GL_TEXTURE_2D, texture1);
glBindTexture(GL_TEXTURE_2D, texture2);
glActiveTexture(GL_TEXTURE0);
glActiveTexture(GL_TEXTURE1); 

после этого texture2 привязывается к текущему текстурному блоку ( GL_TEXTURE0 по умолчанию) и текущая единица текстуры GL_TEXTURE1. Примечание texture1
просто привязан на короткий момент, но привязка теряется, когда texture2 связан.

Для сравнения, когда вы делаете

glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_2D, texture1);
glActiveTexture(GL_TEXTURE1); 
glBindTexture(GL_TEXTURE_2D, texture2);

текущая единица текстуры явно установлена ​​на GL_TEXTURE0, а texture1 привязана к единице текстуры текстуры 0. После этого текущая единица текстуры переключается на GL_TEXTURE1, а texture2 привязывается к единице текстуры 1 (поскольку она является текущей в этот момент).


Обратите внимание, что при использовании Direct State Access и glBindTextureUnit (начиная с OpenGL 4.5) текстуру можно напрямую связать с текстурным блоком. например:

glBindTextureUnit(GL_TEXTURE0, texture1);
glBindTextureUnit(GL_TEXTURE1, texture2);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...