2016-07-10 6 views
0

В настоящее время я переношу множество приложений из рендеринга SDL2 (с использованием OpenGL с использованием OpenGL) в «чистый» рендеринг OpenGL. Во время этой работы я выяснил, как загрузить текстуры на GPU и узнал, что каждая текстура имеет индекс.OpenGL + SDL_TTF: переработка индекса текстур

Для рендеринга текста я использую функции SDL_TTF, которые позволяют в принципе загружать текстуру на графический процессор с изображением какого-либо текста. Большинство приложений, которые я переношу, не являются тяжелыми, но я заметил, что с ними возникла проблема.

Представьте приложение, которое принимает ввод текста пользователя и помещается на экран: каждое нажатие клавиши создаст новую текстуру со всем введенным текстом (любая другая предыдущая текстура, связанная с той же функциональностью, будет удалена). Итак, чтобы написать «Hello», мы получим пять текстур: «H», «He», «Hel», «Hell» и, наконец, «Hello». Как сказано, каждая «предыдущая» текстура (в данном случае от «H» до «Hell») будет удалена, и останется только память для «Hello».

Тем не менее, в текстовых приложениях (например, используя этот метод, чтобы поместить счет игры, делая это достаточно плохо, чтобы вы создавали новую текстуру для каждого кадра), много текстур будет загружено и удалено, а текстура индекс будет продолжать расти.

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

PS: Я знаю о возможности упаковки всех символов TTF в атлас и просто получить буквы, которые мне нужны. Мне не хотелось бы смотреть на это сейчас, если мой нынешний подход не является опасным (этот атлас похож на старые растровые шрифты).

PS2: Я также знаю, что изменение текстур постоянно не очень точно (графический процессор), но эти приложения не являются графически сложными и имеют хорошую производительность в старых системах.

+0

Если это касается вас, почему бы просто не заменить текстурные данные без повторного создания текстуры id/name? То есть 'glTexImage', или выделите большую текстуру и замените части своих данных позже. – keltar

+0

Да, да, это именно то, что я планирую делать в будущем :). См., Все тексты, которые могут измениться (например, вышеупомянутый маркер оценки в игре или подсказках), инкапсулируются в классы, которые управляют удалением своих ресурсов (обычно они имеют длинные периоды жизни, а не многие индексы будут потребляться).Я мог бы очень расширить их, чтобы «заменить» текущую текстуру, но я не знал о каком-то устаревшем коде, на котором я лежал. Большое спасибо. –

ответ

2

Объекты OpenGL называются тем, что спецификация OpenGL вызывает «имена» (другими часто используемыми терминами в программировании являются «дескриптор» или «идентификатор»/«идентификатор»). Когда новое имя сначала связано (с glBind…), создается соответствующий объект OpenGL (текстура, буфер и т. Д.); некоторые функции OpenGL создают объекты и возвращают им имя (glCreate…). После удаления (действительного) имени (с glDelete…) соответствующий объект OpenGL будет освобожден после того, как будет удалена последняя внутренняя ссылка. Имена могут быть повторно использованы повторно (OpenGL) после их удаления, после чего ссылаются на другой объект.


Не изобретайте велосипед. Текстовое рендеринг с OpenGL смехотворно запутан и не существует (пока нет) одного совершенного метода. Однако есть несколько библиотек, которые обращаются к проблемам генерации текстур и управления ресурсами. Сделайте себе одолжение и используйте один из них. В вашем случае FreeType-ГЛ будет лучший вариант (ИМХО): https://github.com/rougier/freetype-gl


1: Я сейчас работаю над новой шейдерной основе глифов растеризации, который обращается большинство известных проблем, но это еще не сделано ,

+0

Datenwolf, спасибо за сообщение, но на самом деле он не отвечает на вопрос, который был опубликован об утилизации индекса. Сейчас я не заинтересован в том, чтобы использовать новые библиотеки, насколько я знаю, как все это работает. Тем не менее, спасибо, я буду держать Ружье в виду, когда все идет на юг :). –

+0

@ TheMarlboroMan: Если вы правильно 'glDeleteTextures' и отвязаете неиспользуемые имена текстур (это произойдет в конечном итоге), имена текстур будут переработаны. Имена текстур не обязательно должны быть инкрементальными или без пробелов. – datenwolf

+0

Я делаю glDeleteTextures в деструкторе самого класса текстуры, так что часть понятна. Честно говоря, я даже не знаю, что в OpenGL есть функция «текстурного имени», поэтому я уверен, что я в безопасности. Не могли бы вы обновить свой ответ с информацией об утилизации, чтобы я мог решить этот вопрос ?. –

 Смежные вопросы

  • Нет связанных вопросов^_^