Это старая версия документа!
Содержание
VRAM
Видеопамять PlayStation. Объем видеопамяти составляет 1 MiB (1024 KiB). VRAM не имеет отображения в системной памяти, доступ к ней осуществляется исключительно через команды GPU.
Цветовые режимы
Текстуры и буферы хранятся в видеопамяти в одном из поддерживаемых цветовых режимов:
- 24-битный - также известен как 24-bit Direct или True Color. На каждый канал выделено по 8 бит. Используется для вывода на экран и декодирования видео.
- 16-битный - также известен как 15-bit Direct. На каждый канал выделено по 5 бит, старший бит - бит прозрачности. Этот режим позволяет хранить 32 × 32 × 32 = 32768 цветов.
- 8-битный индексированный - использует 256-цветовую палитру. Каждый пиксель является 8-битным индексом в палитре.
- 4-битный индексированный - использует 16-цветовую палитру. Каждый пиксель является 4-битным индексом в палитре. Подходит для простейшей 2D-графики и текста.
Для вывода на экран поддерживаются только прямые 24-битный и 16-битный режимы. Для текстур поддерживаются 16-битный, 8-битный и 4-битный.
Значение бита прозрачности в пикселе текстуры (или в сплошном цвете примитива) зависит от ситуации:
- Если цвет пикселя черный (0, 0, 0), то нулевой бит прозрачности означает, что пиксель полностью прозрачный, позволяя, таким образом, реализовать технику alpha cutout. Единица в бите прозрачности означает, что пиксель имеет непрозрачный черный цвет;
- Если цвет пикселя не черный, то бит прозрачности включает или выключает полупрозрачность/смешивание (0 = выключено, 1 = включено).
Адресация
VRAM адресуется как двумерный буфер разрешением 2048×512 байт, что эквивалентно 1024×512 пикселей в 16-битном цветовом режиме. В левом верхнем углу этого прямоугольника обычно находятся буферы кадра (вверху первичный, под ним - вторичный).
Доступ к текстурам организован постранично. Текстурная страница - это логическая область размером 256×256 16-битных пикселей. GPU использует ее при текстурировании полигонов. Независимо от цветового режима, текстурные координаты имеют диапазон 0..255, поэтому один полигон не может напрямую адресовать текстуру большего размера. Это позволяет кодировать UV-координаты вершин всего двумя байтами.
Одна и та же текстурная страница физически занимает разный объем памяти, так как ширина страницы в байтах зависит от цветового режима текстуры:
- 4-битный - TP=0 - 64 пикселя - 32 KiB
- 8-битный - TP=1 - 128 пикселей - 64 KiB
- 16-битный - TP=2 - 256 пикселей - 128 KiB
Текстуры располагаются в VRAM с учетом того, что GPU адресует память 16-битными пикселями. Позиция текстуры (или CLUT) обычно зашивается в заголовок данных файла TIM, где задается 16-битными координатами tx и ty, где:
- tx - горизонтальная координата в 16-битных пикселях;
- ty - вертикальная координата в строках
Эти координаты используются для загрузки данных в видеопамять командой GP0(A0h), но для чтения их напрямую использовать нельзя. При рисовании текстурированного полигона в GP0 отправляется значение tpage, 16-битное поле, которое кодирует положение страницы и параметры ее использования:
- Биты 0-3: pageX, горизонтальный индекс страницы (0-15 включительно)
- Бит 4: pageY, вертикальный индекс страницы (0 или 1)
- Биты 5-6: ABR, режим прозрачности (0, 1, 2 или 3, см GPU: Прозрачность и смешивание)
- Биты 7-8: TP, цветовой режим текстуры (0, 1 или 2)
Если при загрузке изображения известны его координаты в VRAM (tx, ty) и цветовой режим, то искомое значение tpage получается следующим образом:
uint8_t pageX = tx / 64; uint8_t pageY = ty / 256; uint32_t tpage = pageX | (pageY << 4) | (abr << 5) | (tp << 7);
Если на одной странице располагаются несколько текстур, дополнительно вычисляется относительная позиция текстуры на странице (px, py):
uint8_t px = (uint8_t)(tx % 64); uint8_t py = (uint8_t)ty;
При рисовании полигонов tpage определяет, из какой страницы считывать текстуру, а px+U и px+V для вершин указывают конкретный пиксель внутри страницы.
