5.5 KiB
5.5 KiB
Математический процессор (GTE) в PlayStation 1
Geometry Transformation Engine (GTE) — это сопроцессор в PS1, отвечающий за ускорение математических операций, критичных для 3D-графики. Он работает параллельно с основным CPU (R3000A) и оптимизирован для:
- Перемножения матриц
- Вращения и трансформации вершин
- Расчёта перспективы и освещения
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-пространства:
- Учитывает камеру (матрица вида).
- Применяет перспективу (деление на Z).
- Оптимизирует расчёт 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. Зачем нужно перемножение матриц?
Матрицы используются для:
- Поворота объектов
\begin{bmatrix} \cosθ & -\sinθ & 0 \\ \sinθ & \cosθ & 0 \\ 0 & 0 & 1 \\ \end{bmatrix} \cdot \begin{bmatrix} X \\ Y \\ Z \end{bmatrix} - Масштабирования
\begin{bmatrix} S_x & 0 & 0 \\ 0 & S_y & 0 \\ 0 & 0 & S_z \\ \end{bmatrix} - Смещения (трансляции)
\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.