vault backup: 2025-04-18 23:10:56

This commit is contained in:
sShemet
2025-04-18 23:10:56 +05:00
parent 8f4ceebaf3
commit 491d7fc92a
15 changed files with 421 additions and 17 deletions

View File

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