Как работает Texture Cache в Tile Based Rendering GPU

9

Как кеш работает с рендерингом на основе плиток?

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

Фелипе Лира
источник
1
Что вы подразумеваете под вертикальным расположением горизонтальных треугольников?
Мокоша
@Мокоша извини, это как-то незаметно для меня. Я только что видел это сейчас. Это скорее теоретический, чем практический вопрос, и я даже не знаю, имеет ли это смысл сейчас. В любом случае, я имел в виду, скажем, треугольник, пересекающий плитки (x, y) и (x + 1, y), и что эти две плитки обрабатываются одна за другой. Будет ли это лучше для текстурного кэша, чем если бы у меня был треугольник, пересекающийся (x, y) и (x, y + 1)? (Из-за того, что пиксели границы и расположение треугольников не совпадают в одном направлении, обработка плиток идет)
Фелипе Лира

Ответы:

19

Будь то графический процессор на основе тайлов или нет, на самом деле не влияет на архитектуру кеша текстур. Структура памяти в текстуре будет выглядеть как разновидность порядка Мортона или кривой Гильберта во всех графических процессорах.

В результате более эффективно визуализировать треугольники, близкие к равносторонним треугольникам, поскольку система памяти GPU извлекает строки кэша текселей.

Очевидно, что на границах тайлов может случиться так, что вам придется выбирать тексели дважды. Это имеет небольшую стоимость, так как границы листов составляют всего лишь «несколько» пикселей.

Возможно настольные графические процессоры ведут себя идентично графическим графическим процессорам, как показано в следующих экспериментах: http://www.g-truc.net/post-0597.html

Размер плиток различен, но обе архитектуры фактически обрабатывают фрагменты в иерархию плиток разных размеров.

При кодировании для графических процессоров на основе тайлов я рекомендую всегда иметь в виду:

  1. Не переключайте объекты кадрового буфера, если это действительно не нужно.
  2. При связывании нового объекта кадрового буфера, если вам не нужно сохранять содержимое текущего кадрового буфера, откажитесь от него. Если вы не хотите загружать содержимое нового кадрового буфера, вы должны очистить кадровый буфер.
Christophe
источник
Я обновил второй пункт, так как редактирование было не тем, что я имел в виду. В противном случае это выглядит великолепно!
Кристоф
Привет, Кристоф, ты имел в виду "равносторонние" треугольники, а не "равнобедренные"? Вместо «Гильберта» я бы сказал «Мортон», так как аппаратная адресация намного проще.
Саймон Ф
@ Кристоф спасибо! Это действительно полезно. Итак, для пикселей границы не имеет значения кеш текстуры? Это было своего рода то, что мне было интересно. Итак, если у меня есть треугольник, который пересекает тайлы (x, y) и (x + 1, y) и GPU просто растеризовал плитку (x, y). Предполагая, что плитка (x + 1, y) будет следующей, даже если ее обрабатывают другие исполнительные блоки, не выиграю ли я от использования кэша текстур при выборке текселей для этого треугольника?
Фелипе Лира
Кроме того, мне стало любопытно узнать о схеме Гильберта. Я всегда предполагал, что это правда для блоков сжатых текстур. Это правда для всех текстур? PS: я также не следовал последнему абзацу.
Фелипе Лира
PVRTC кодирует текстурные блоки в порядке
следования