Files
SergObsidian/PERSONAL PROJECTS/PS1 DOCS/PS1 Geometry Transformation Engine.md
2025-04-18 23:10:56 +05:00

5.5 KiB
Raw Blame History

Математический процессор (GTE) в PlayStation 1

Geometry Transformation Engine (GTE) — это сопроцессор в PS1, отвечающий за ускорение математических операций, критичных для 3D-графики. Он работает параллельно с основным CPU (R3000A) и оптимизирован для:

  1. Перемножения матриц
  2. Вращения и трансформации вершин
  3. Расчёта перспективы и освещения

1. Основные функции GTE

1.1. Быстрые матричные операции

GTE умеет:

  • Умножать матрицу 3×3 на вектор (для поворота объектов).
  • Вычислять матрицу модели-вида (Model-View).
  • Обновлять нормали объектов для освещения.

Пример: Поворот вершины:

# Вход: матрица вращения в $a0, вершина (x,y,z) в $a1
lw $t0, 0($a0)   # Загружаем элемент матрицы
lw $t1, 0($a1)   # Загружаем X вершины
mult $t0, $t1    # Умножаем (GTE делает это за 1 такт)
mflo $t2         # Результат

1.2. Перспективное преобразование

GTE вычисляет экранные координаты (X,Y) из 3D-пространства:

  1. Учитывает камеру (матрица вида).
  2. Применяет перспективу (деление на Z).
  3. Оптимизирует расчёт FOV (поля зрения).

Формула: [ X_{screen} = \frac{X_{3D} \cdot scale}{Z_{3D}} + center_x ]


1.3. Освещение и цвет

  • GTE рассчитывает интенсивность света для вершин.
  • Поддерживает до 3 источников света (накладывает цвета).
  • Работает с нормалями (через скалярное произведение).

Пример:

# Нормаль в $a0, свет в $a1
dp $t0, $a0, $a1  # Скалярное произведение (GTE)
sll $t0, 8        # Яркость = 0..255

2. Зачем нужно перемножение матриц?

Матрицы используются для:

  1. Поворота объектов
    \begin{bmatrix}
    \cosθ & -\sinθ & 0 \\
    \sinθ & \cosθ & 0 \\
    0 & 0 & 1 \\
    \end{bmatrix} \cdot 
    \begin{bmatrix} X \\ Y \\ Z \end{bmatrix}
    
  2. Масштабирования
    \begin{bmatrix}
    S_x & 0 & 0 \\
    0 & S_y & 0 \\
    0 & 0 & S_z \\
    \end{bmatrix}
    
  3. Смещения (трансляции)
    \begin{bmatrix} 1 & 0 & T_x \\ 0 & 1 & T_y \\ 0 & 0 & 1 \end{bmatrix}
    

GTE делает это за 1-2 такта (вместо 10+ тактов на R3000A).


3. Пример: поворот куба на PS1

Код на C с ассемблерными вставками

#include <libgte.h>

typedef struct { short x, y, z; } Vertex;

void rotate_vertex(Vertex *v, int angle) {
    MATRIX rot_matrix;
    int sin, cos;
    
    // Получаем синус/косинус угла (через GTE)
    gte_ldsin(angle, &sin);
    gte_ldcos(angle, &cos);
    
    // Заполняем матрицу поворота вокруг Z
    rot_matrix.m[0][0] = cos;  rot_matrix.m[0][1] = -sin;
    rot_matrix.m[1][0] = sin;  rot_matrix.m[1][1] = cos;
    
    // Умножаем матрицу на вершину (через GTE)
    gte_rtps(v->x, v->y, v->z, &rot_matrix, &v->x, &v->y, &v->z);
}

4. Оптимизации через GTE

4.1. Пакетная обработка

  • GTE может обрабатывать до 3 вершин за инструкцию (rtpt).
  • Пример для треугольника:
    rtpt        # Поворот 3 вершин сразу
    nop
    

4.2. Отложенные вычисления

  • Команды nclip и avsz3 считают площадь полигона и Z-буфер без CPU.

4.3. Интеграция с GPU

  • Результаты GTE (экранные X,Y,Z) передаются в GPU через DMA.
  • Это ускоряет рендеринг в 5-10 раз.

5. Сравнение с современными GPU

Функция PS1 (GTE) Современный GPU
Матричные операции 1-2 такта 1 такт
Макс. источников света 3 100+
Поддержка шейдеров Нет Да

6. Итог

  • GTE — это «сердце» 3D-графики PS1, отвечающее за:
    • Поворот, масштабирование, перспективу.
    • Освещение и цвет.
  • Без GTE игры вроде Tekken 3 или Metal Gear Solid работали бы на 1-2 FPS.
  • Оптимизация под GTE — ключ к плавному рендерингу на PS1.

Для глубокого изучения смотрите GTE Technical Reference.