Можно ли использовать случайный идентификатор текстуры? - PullRequest
6 голосов
/ 20 декабря 2011

Вместо использования glGenTextures() для получения неиспользуемого идентификатора текстуры. Могу ли я случайно выбрать число, скажем, 99999 и использовать его?

Я, конечно, запрос:

glIsTexture( m_texture )

и убедитесь, что он ложный, прежде чем продолжить.

Вот немного фона:

Я разрабатываю приложение для создания слайдшоу изображений для Mac. Предварительный просмотр слайд-шоу безупречен. Чтобы сохранить слайд-шоу, я рендеринг в FBO. Я создаю контекст AGL, создаю экземпляр текстуры с glGenTextures() и рендеринг в буфер кадров. Все хорошо, за исключением незначительного вопроса.

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

Я исследовал это и обнаружил, что миниатюры изображений и моя текстура FBO так или иначе имеют одинаковый идентификатор текстуры. Когда я удаляю свою текстуру FBO в конце операции сохранения слайд-шоу, текстуры миниатюр также теряются. Это странно, потому что у меня во время сохранения есть AGL-контекст, а у основного пользовательского интерфейса есть еще один AGL-контекст, предположительно созданный в фоновом режиме Core Image и над которым у меня нет контроля.

Так что мои варианты, как я вижу это сейчас, это:

  1. Не удалять текстуру FBO.
  2. Случайно выбирайте высокий ID текстуры в надежде, что основной интерфейс не будет его использовать.

На самом деле я прочитал, что вам не обязательно удалять свою текстуру, если вы удаляете контекст AGL opengl. Потому что удаление вашего контекста openGL автоматически удаляет все связанные текстуры. Это правда? Если да, вариант 1 имеет больше смысла.

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

Ответы [ 2 ]

11 голосов
/ 20 декабря 2011

Позвольте мне сначала ответить на ваш основной вопрос: да, законно в OpenGL 2.1 - просто произвольно выбирать имя текстуры и использовать его в качестве текстуры. Обратите внимание, что это не законно в ядре 3.2. Тот факт, что OpenGL ARB удалил эту способность, должен проиллюстрировать, является ли это хорошей идеей или нет.

Теперь вы, кажется, наткнулись на странную ошибку. glGenTextures никогда не должен возвращать имя текстуры, которое уже используется. В конце концов это то, для чего это. Вы, кажется, каким-то образом получаете текстуры, которые уже используются. Я не знаю, как это происходит.

Контекст OpenGL, когда уничтожен, удалит все ресурсы , специфичные для этого контекста . Если вы создали второй контекст, который совместно использует ресурсы с первым, удаление второго контекста не удалит общие ресурсы (текстуры, буферы и т. Д.). Он удалит нераспределенные ресурсы (VAO и т. Д.), Но все остальное останется.

Я бы предложил не создавать и не удалять текстуру FBO постоянно. Просто создайте его при запуске приложения. В худшем случае вам придется перераспределять хранилище для объекта по мере необходимости (через glTexImage2D), если вам нужен другой размер или что-то еще.

0 голосов
/ 09 февраля 2012

Всем, у кого есть эта проблема, убедитесь, что ваш контекст полностью инициализирован;пока он не будет равен glGenTextures, он всегда будет возвращать 0. Я сначала не осознавал, что происходит, потому что кажется, что 0 все еще является действительным идентификатором текстуры.

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