### **Математический процессор (GTE) в PlayStation 1** **Geometry Transformation Engine (GTE)** — это сопроцессор в PS1, отвечающий за ускорение математических операций, критичных для 3D-графики. Он работает параллельно с основным CPU (R3000A) и оптимизирован для: 1. **Перемножения матриц** 2. **Вращения и трансформации вершин** 3. **Расчёта перспективы и освещения** --- ## **1. Основные функции GTE** ### **1.1. Быстрые матричные операции** GTE умеет: - Умножать **матрицу 3×3** на вектор (для поворота объектов). - Вычислять **матрицу модели-вида** (Model-View). - Обновлять **нормали объектов** для освещения. **Пример**: Поворот вершины: ```mips # Вход: матрица вращения в $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 источников света** (накладывает цвета). - Работает с **нормалями** (через скалярное произведение). **Пример**: ```mips # Нормаль в $a0, свет в $a1 dp $t0, $a0, $a1 # Скалярное произведение (GTE) sll $t0, 8 # Яркость = 0..255 ``` --- ## **2. Зачем нужно перемножение матриц?** Матрицы используются для: 1. **Поворота объектов** ```math \begin{bmatrix} \cosθ & -\sinθ & 0 \\ \sinθ & \cosθ & 0 \\ 0 & 0 & 1 \\ \end{bmatrix} \cdot \begin{bmatrix} X \\ Y \\ Z \end{bmatrix} ``` 2. **Масштабирования** ```math \begin{bmatrix} S_x & 0 & 0 \\ 0 & S_y & 0 \\ 0 & 0 & S_z \\ \end{bmatrix} ``` 3. **Смещения (трансляции)** ```math \begin{bmatrix} 1 & 0 & T_x \\ 0 & 1 & T_y \\ 0 & 0 & 1 \end{bmatrix} ``` **GTE делает это за 1-2 такта** (вместо 10+ тактов на R3000A). --- ## **3. Пример: поворот куба на PS1** ### **Код на C с ассемблерными вставками** ```c #include 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`). - Пример для треугольника: ```mips 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](http://problemkaputt.de/psx-spx.htm#gtegeometrytransformationengine).