2013-07-30 2 views
1

Я только что читал о преимуществах неизменного хранения текстур. Хотя я понимаю, что, используя изменяемое хранилище, я бы мог изменить размер хранилища текстур по требованию, я не понимаю, почему я бы хотел.Какие методы требуют изменчивого хранения текстур

Какие методы используют изменчивое хранение текстур таким образом, что это невозможно или плохо выполняется в неизменяемом хранилище текстур?

ответ

3

Позвольте мне процитировать из обсуждений ARB в ARB_texture_storage extension. Обратите внимание, что эти вопросы и обсуждение от независимых поставщиков, которые реализуют OpenGL, человек, которые знают свои графические процессоры лучше, чем большинство из нас:

4: Если использование этих входных точек делают метаданные (формат и размеры) неизменный?

RESOLVED: Да.

ОБСУЖДЕНИЕ: Преимущества знания метаданных не могут измениться, вероятно, перевесят дополнительные затраты на проверку флага TEXTURE_IMMUTABLE_FORMAT при каждом вызове спецификации текстуры.

5: Должно ли законно полностью заменить текстуру, используя новый вызов TexStorage *?

RESOLVED. Это не допустимо.

ОБСУЖДЕНИЕ: Это полезно для аннулирования всех уровней текстуры. Разрешить изменение метаданных здесь проще, чем пытаться определить переносимое определение того, что означает изменение метаданных (например, что, если во второй раз вы использовали нестандартный внутренний формат и внутренний формат соответствующего размера во второй раз, Versa)?

Однако, хотя это во многом аналогично удалению старого объекта текстуры и замене его новым, оно утрачивает некоторые преимущества неизменности. В частности, поскольку при этом не происходит сброс привязок, он не позволяет путь перехода к API, который проверяет формат текстуры во время привязки.

6: Должен ли законный использовать TexImage * после TexStorage *, если он не влияет на метаданные?

ПОСТАНОВИЛИ: Нет

ОБСУЖДЕНИЯ: Потенциальный случай использования, чтобы позволить один уровень текстуры, чтобы быть признан недействительным, используя указатель NULL.Однако, как отмечено выше, нетривиально определить, что представляет собой изменение.

Позвольте мне поставить это по-другому: если ARB мысли в месте текстуры модификация была хорошая идея, они не имели бы glTexStorageявно запретить его.

2

Есть несколько случаев, когда изменяемые текстуры полезны. Вот несколько из них.

  1. В приложении GPGPU очень часто бывает, что входные данные не полностью решены, но разрежены. В таких случаях мне приходилось тратить память - изменяемые текстуры позволяют изменять размер, чтобы предотвратить это.
  2. Самозванец/щит LOD - нет необходимости выделять большую текстуру, когда что-то маленькое будет делать
  3. данных в зависимости от математических операций с текстурами, скажем, свертка на основе вычисленной маски/размер
  4. Кэширование куски «дорого» оказал выход для композитинга. Динамическое изменение размера этих текстур хранения экономит драгоценную память GPU.

И еще многие из них, вероятно, отсутствуют, но я надеюсь, что вы получите суть.

+2

-1: Нет. Просто ... просто нет. Если вам когда-либо понадобится «изменить размер» текстуры, вы можете просто уничтожить ее и создать новый подходящий размер. Нет абсолютно никаких оснований делать это на месте внутри объекта текстуры –

+0

Приветствую вас обоих, хорошо знать, что люди действительно используют эти функции, даже если может быть случай, если вы этого не сделаете. @Nicol: Это просто изменение размера, которое было проблемой, или вы находите удаление и изменение размера достаточно быстро для всех ваших потребностей? – Baggers

+0

@NicolBolas Выделение текстур - вызов драйвера. Изменение размера текстуры может быть намного проще в драйвере, чем выделение новой текстуры, следовательно, быстрее. Мой собственный реальный опыт подтверждает это утверждение здесь (http://www.opengl.org/discussion_boards/showthread.php/156246-glGenTextures-DeleteTextures-performance) * Таким образом, если вы можете повторно использовать один и тот же объем памяти (скажем, текстуры имеет тот же формат и тот же размер), тогда гораздо эффективнее не освобождать текстуру *. Я также считаю, что причина в том, что это превратилось в спецификацию OpenGL. Спасибо за ваше мнение, – Ani

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