Чем отличаются OpenGL texelFetch и текстура?

18

Я понимаю основные различия между texelFetchи texture, но у меня есть несколько вопросов о деталях:

  • Влечет ли это texelFetchснижение производительности? Например, не использовать кеш или что-то подобное?
  • Являются ли texelFetchи textureвзаимозаменяемы при использовании GL_NEAREST?
Мартин Перри
источник
1
Вы можете написать контрольный пример и посмотреть ...
ThorinII
1
Вы забыли пометить ответ как принятый, или это все еще открытый вопрос?
Анко

Ответы:

23

texelFetchсильно отличается от texture.

textureваша обычная функция доступа к текстуре, которая обрабатывает фильтрацию и нормализованные ( [0,1]) координаты текстуры. texelFetchнапрямую получает доступ к текселю в текстуре (без фильтрации), используя ненормализованные координаты (например, (64,64)в текселе со средним значением в текстуре 128x128 против (.5,.5)нормализованных координат).

Шон Миддледич
источник
4
+1 Я хотел бы добавить, что texelFetch предназначен для доступа к данным, когда текстура не предназначена специально для отображения в виде изображения, а для другого типа данных, в отличие от текстуры, которая обращается к текселям, когда они предназначены для использования в качестве изображений, именно поэтому он использует фильтрацию и т. д. -
concept3d
Есть ли разница в производительности?
Ленар Хойт
1
@mcb: возможно, но я бы не ожидал, что он будет очень большим, и, вероятно, он сильно зависит от производителя оборудования. Производительность - это абсолютно неправильный показатель, который следует использовать при принятии решения о том, какую из этих функций вызывать: используйте ту, которая подходит для вашей ситуации (вам либо нужна аппаратная фильтрация, и вы должны использовать ее, textureлибо вам необходимо аппаратное обеспечение, чтобы не выполнять фильтрацию, и поэтому необходимо использовать texelFetch).
Шон Мидлдич
3
@SeanMiddleditch Как в этом случае производительность является неправильной метрикой? Если texelFetchэто быстрее и достаточно фильтрации ближайших соседей, вы не можете изменить контекст на NN-фильтрацию по какой-либо причине, было бы разумно предпочесть его texture.
Ленар Хойт
@mcb: texelFetchи textureработать по-разному в основных направлениях. Смотрите также входные данные: координаты текстуры против нормализованных координат. Они служат разным целям. Один не просто оптимизация другого.
Шон Мидлдич
6

Поскольку нет принятого ответа, я добавляю некоторую информацию, я хотел просто добавить то, что еще не было сказано Шоном в его ответе.

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

  • Некоторые фильтры постобработки (Guassian blur использует интерполяцию образца текстуры и поэтому не может использовать TexelFetch)
  • Когда вершинам нужно читать данные из текстур, а это операция, зависящая от 2 координат

Tex2D рассматривает текстуру как текстуру. Вы не хотите точное содержание пикселя, но вы хотите наиболее реалистичный результат. Стандартное чтение текстур - очень сложная операция, которая включает в себя чтение интерполированных данных с одного или нескольких уровней MIP-карт, а затем снова интерполирует. Все эти дорогостоящие операции должны избегать визуальных артефактов.

GL_NEAREST не будет работать так же, потому что на самых дальних полигонах вы читаете данные на меньшем уровне mipmap, которые не совпадают с точными данными, которые вы читали бы из выборки texel.

Есть один случай, когда Tex2D (почти) работает так же, как TexelFetch:

  1. фильтр GL_NEAREST
  2. Вы используете неполную пирамиду MipMap с 1 уровнем
  3. ваши UV не являются нормализованными компонентами вершин (но вы должны нормализовать их в шейдере)
Разработчик игр
источник