Как GPU обрабатывает текстуру и VRAM?

18

На самом деле это куча взаимосвязанных вопросов:

  1. Являются ли сжатые текстуры (dxt5 / dxt1 и т. Д.) Когда-либо полностью распакованными при прохождении конвейера рендеринга?

  2. Если ответ на первый вопрос верен, то как управляется память для нескольких больших несжатых текстур?

  3. Отличается ли framebuffer от VRAM в современном GPU?

Allahjane
источник

Ответы:

29

Графические форматы сжатых текстур, такие как DXT / BC / ETC , специально разработаны для чтения непосредственно из сжатой формы. Их не нужно распаковывать в необработанный буфер RGBA.

Это работает так, что каждый блок текселей (часто 4х4) занимает некоторое фиксированное число битов - поэтому мы точно знаем, как далеко в буфере искать конкретный тексель - и эти блоки могут быть распакованы без чтения всего окружения / предшествующая текстура информации. Графические процессоры содержат специализированное оборудование, которое распаковывает только требуемые блоки текселей, необходимые для выполнения запросов на выборку текстур от ваших шейдеров.

Это отличается от форматов, таких как jpg & png, где объем пространства, занимаемого каждым текселем, может варьироваться по изображению (детализированные области занимают больше данных, предсказуемые области занимают меньше), поэтому для поиска конкретного текселя вам нужно распаковать целое изображение или, по крайней мере, большие / распределенные его фрагменты. Но поскольку они могут выборочно сжимать предсказуемые области текстуры, они, как правило, сжимают изображения до меньших размеров для хранения на диске или передачи по сети, чем то, что мы получаем из форматов, дружественных к GPU. Разные стратегии для разных целей.


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

« Framebuffer » - это просто определенный фрагмент видеопамяти, который мы решили использовать для хранения составного изображения, которое мы хотим представить на экране. Обратите внимание на детали в ответе JarkkoL, где на некотором специализированном оборудовании мы могли бы выбрать размещение этого буфера в определенной части нашей доступной видеопамяти, которая оптимизирована для потребностей полосы пропускания целей рендеринга.

Д.М.Григорий
источник
Эта ссылка на алгоритм сжатия чрезвычайно полезна и глубока. Хорошая находка!
Кобурн
7

Ответы на ваши вопросы действительно зависят от платформы. Обычно форматы BC хранятся в сжатом виде в памяти, а распаковка выполняется в полете текстурными блоками графического процессора, но есть исключения. А именно, Xbox 360, как известно, распаковывает полные блоки BC размером 4x4 пикселя для кэширования, прежде чем TU извлекает данные, таким образом, увеличивая использование кэша. Я не знаю ни одной платформы, которая распаковывала бы всю текстуру до vram при загрузке, но я сильно сомневаюсь в этом из-за дополнительной памяти и использования полосы пропускания.

То же самое относится и к фреймбуферам - это зависит от платформы. На Xbox 360 у вас было 10 МБ выделенной высокоскоростной EDRAM, которую вы должны были использовать для целей рендеринга. В Xbox One у вас все еще есть 32 МБ специальной ESRAM, которая предпочтительна для целей рендеринга из-за высокой пропускной способности (и также может быть выбрана в отличие от Xbox 360), но цели рендеринга также могут находиться в обычной памяти DDR3.

JarkkoL
источник