RTPS
RTPS (Rotate-Translate-Perspective Single) - инструкция GTE, которая осуществляет полный процесс проекции одной вершины из мирового в экранное пространство.
Входные данные:
- R - Q3.12 (1 бит знака, 3 бита целой части, 12 бит дробной части; 1.0 = 2^12 = 0x1000).
- TR - 32-битное целое число со знаком.
- H - 16-битное целое число без знака.
- OFX, OFY - Q15.16 (1 бит знака, 15 бит целой части, 16 бит дробной части; 1.0 = 2^16 = 0x10000).
- DQA - Q7.8 (1 бит знака, 7 бит целой части, 8 бит дробной части; 1.0 = 2^8 = 0x100).
- DQB - Q7.8 (1 бит знака, 7 бит целой части, 8 бит дробной части; 1.0 = 2^8 = 0x100).
Выходные данные:
- SXY2 - экранные координаты XY (16-битные целые числа со знаком).
- SZ3 - экранная координата Z (16-битное целое число без знака).
Порядок вычислений:
1. Трансформация вершины матрицей поворота (R) и вектором смещения (TRX, TRY, TRZ):
MAC1 = TRX + R11*VX0 + R12*VY0 + R13*VZ0 -> IR1 MAC2 = TRY + R21*VX0 + R22*VY0 + R23*VZ0 -> IR2 MAC3 = TRZ + R31*VX0 + R32*VY0 + R33*VZ0 -> IR3
Матрица 3×3 размещается в регистрах R11R12, R13R21, R22R23, R31R32, R33 следующим образом:
R11+R12 R13 R21 R22+R23 R31+R32 R33
Результаты попадают в регистры IR1, IR2, IR3 и 32-битные аккумуляторы MAC1, MAC2, MAC3.
2. Нормированное значение MAC3 добавляется в FIFO глубины:
SZ3 = SZ2 SZ2 = SZ1 SZ1 = SZ0 SZ0 = clamp(MAC3 SAR 12)
SAR - это операция «арифметический сдвиг вправо» (битовый сдвиг с сохранением знака). Это масштабирование, которое сжимает диапазон глубины до ±524 287.
Новое значение Z попадает в SZ0, старые данные сдвигаются вверх по номерам.
3. Перспективное деление:
n = H / SZ3
GTE делит H (дистанцию проекции) на SZ3 (глубина вершины) с помощью аппроксимации Ньютона-Рафсона. Деление неточное - это аппаратное ограничение, которое и порождает характерное дрожание вершин в графике PlayStation. Если SZ3 = 0 или H >= 2*SZ3, деление переполняется (n = 0x1FFFF), и поднимаются флаги FLAG.Bit17 и FLAG.Bit31 (вершина за камерой или слишком близко).
Дистанция проекции (16 бит) обычно равна 0x0100.
3. Вычисление экранных координат:
SX2 = OFX + IR1 * n SY2 = OFY + IR2 * n
Экранные координаты обрезаются в диапазон -1024..+1023.
OFX, OFY - экранный сдвиг (обычно центр экрана) в формате Q16.15:
OFX = 160 << 16 OFY = 120 << 16
IR1, IR2 - повернутые координаты из шага 1.
Результат добавляется в очередь SXY-FIFO:
SXY0 = SXY1
SXY1 = SXY2
SXY2 = {SX2, SY2}
Новое значение попадает в SXY2, старые данные сдвигаются вниз по номерам.
4. Depth cueing для интерполяции цвета по глубине:
MAC0 = ((H/SZ3) * DQA + DQB) IR0 = MAC0 / 0x1000
DQA и DQB - коэффициенты затухания, IR0 - интерполяционный коэффициент, который потом используют команды DPCS, NCDT и др.
