OpenGL, отключение текстурного блока, glActiveTexture и glBindTexture - PullRequest
4 голосов
/ 25 сентября 2011

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

Create texture 1 (implies binding it)
Use texture 1 with texture unit 1
Create texture 2 (implies binding it)
Use texture 2 with texture unit 2

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

Create texture 1
Create texture 2
Use texture 1 with texture unit 1
Use texture 2 with texture unit 2

Я, конечно, упростил пример, но тот факт, что создание и привязка текстуры могут случайно повлиять на активный в данный момент текстурный блок, даже когда вы привязываете текстуру как часть процесса создания, вызывает у меня некоторое неудобство. , Если, конечно, я не допустил ошибку здесь, и есть что-то, что я могу сделать, чтобы отключить изменения состояния в текущей glActiveTexture?

Спасибо за любую помощь, вы можете оказать мне здесь.

1 Ответ

4 голосов
/ 25 сентября 2011

Это почти то, чему вы должны научиться жить в OpenGL.Функции GL влияют только на текущее состояние.Таким образом, чтобы изменить объект, вы должны привязать его к текущему состоянию и изменить его.

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

И вообще, я бы предложил связывать текстуры после создания (т.е.: glBindTexture(..., 0)).Это предотвращает их застревание.

И помните: когда вы связываете текстуру, вы также открепляете любую текстуру, которая была привязана в данный момент.Таким образом, функции текстуры будут влиять только на новый объект.

Однако, если вы хотите положиться на расширение EXT, существует EXT_direct_state_access.Он поддерживается NVIDIA и AMD, поэтому довольно широко доступен.Он позволяет вам изменять объекты, не связывая их, поэтому вы можете создать текстуру, не связывая ее.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...