144 lines
5.5 KiB
Markdown
144 lines
5.5 KiB
Markdown
### **Математический процессор (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 <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`).
|
||
- Пример для треугольника:
|
||
```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). |