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

144 lines
5.5 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

### **Математический процессор (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).