Как вы «освобождаете» текстурный блок? - PullRequest
0 голосов
/ 01 мая 2018

Чтобы использовать текстурный блок, мы обычно привязываем его к текущему процессу примерно так:

glUseProgram(program);
glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_2D, textureID);

GLint loc = glGetUniformLocation(program, "uniform");
//error check

glUniform1i(loc,0);

Как вы "освободите" текстурный блок. Другими словами, как отсоединить текстуру от точки привязки текстурного блока в текущей программе?

Ответы [ 2 ]

0 голосов
/ 01 мая 2018

В строгом смысле ... вы не можете. Вы можете привязать объект текстуры 0, но это считается допустимым объектом текстуры (хотя и с явно странным поведением). Вы можете использовать не-DSA-функции, чтобы заполнить их данными и использовать (в основном) как обычную текстуру.

Теперь да, большинство современных пользователей OpenGL никогда не используют текстурный объект 0. Они оставляют его в состоянии по умолчанию и рассматривают его связывание как отсутствие текстурного блока. Действительно, передача от 0 до glBindTextureUnit приводит к тому, что все текстурные цели для этого текстурного блока привязаны к 0 (в то время как использование обычного объекта привязывает только цель этого объекта к этому блоку, оставляя другие цели в пределах блока без изменений).

Все это, позвольте мне дать необычный взгляд на это: вам не нужно отвязывать текстуры из контекста.

Если программа не использует текстурный модуль, то тот факт, что что-то связано с этим модулем, не имеет значения. Привязка текстуры к текстурному блоку не мешает вам использовать другие текстурные блоки; только те, которые использует программа (которые соответствуют правильному типу текстуры), будут иметь значение. А удаление текстур приведет к тому, что они будут автоматически отсоединены от контекста (но только от текущего контекста; если у вас несколько контекстов, они все равно будут там связаны).

Так что это на самом деле не служит цели для развязывания текстуры. Действительно, оно может иметь определенные преимущества.

Если вы случайно используете текстурный блок с привязкой 0 (который концептуально не связан), вы можете получить ошибку OpenGL. Но вы не можете. Если вы этого не сделаете, то вы получите текстуру, которая содержит белые пиксели. Это может или не может быть явно неправильно для вашего кода.

Напротив, если вы случайно используете текстурный модуль, к которому привязаны старые данные, вы либо получите ошибку OpenGL, либо вы определенно получите что-то, что явно неверно.

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

0 голосов
/ 01 мая 2018

Как вы "освободите" текстурный блок. Другими словами, как отсоединить текстуру от точки привязки текстурного блока в текущей программе?


Вы не можете «освободить» текстурный блок, но вы можете привязать объект текстуры по умолчанию к текстурному блоку.

См. Спецификация профиля совместимости API OpenGL 4.6; 8.1. Объекты текстуры; страница 178 :

Текстуры в GL представлены именованными объектами. Пространство имен для объектов текстуры представляет собой целые числа без знака, с нулем, зарезервированным GL для представления объекта текстуры по умолчанию .

...

Привязка осуществляется по телефону

void BindTexture( enum target, uint texture );

с целью, установленной на желаемую цель текстуры, а текстурой - неиспользуемое имя.

Это значит

GLuint defaultTextureObjectID = 0;
glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_2D, defaultTextureObjectID);

свяжет объект текстуры по умолчанию с единицей текстуры 0.


Начиная с OpenGL 4.5 его можно использовать glBindTextureUnit

Команда

void BindTextureUnit( uint unit, uint texture );

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

Так что вы также можете использовать следующее:

glBindTextureUnit( 0, 0 ); // texture unit 0, default texture object (0)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...