aboutsummaryrefslogtreecommitdiff
path: root/docs/specs/render-parity.md
blob: 5c63c13db95be96c88f415d5a5c159c6ed0854e5 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
# Рендер-паритет (кадровый diff)

Документ описывает процесс проверки соответствия рендера:  
`оригинальный движок -> эталонный кадр -> render-demo -> diff-метрики`.

## Цель

- Зафиксировать объективный критерий "паритет достигнут / не достигнут".
- Убрать субъективную визуальную оценку "похоже/не похоже".
- Дать CI-проверку, которая ловит регрессии сразу после коммита.

## Единица проверки

Один тест-кейс = один объект (одна модель) + фиксированная конфигурация:

- архив ресурса;
- имя модели;
- `lod`;
- `group`;
- размер кадра (`width`, `height`);
- угол камеры (`angle`);
- PNG-эталон из оригинального рендера.

## Инварианты детерминизма

Для корректного сравнения кадры должны быть сняты в одинаковых условиях:

- одинаковый FOV и расстояние камеры до объекта;
- одинаковый clear-color/фон;
- одинаковые `lod/group`;
- фиксированный угол (`angle`), без анимации;
- фиксированное разрешение.

## Метрики сравнения

Сравнение выполняется по RGB-каналам:

- `mean_abs`: средняя абсолютная разница канала (0..255);
- `max_abs`: максимальная разница канала;
- `changed_ratio`: доля пикселей, где хотя бы один канал превышает `diff_threshold`.

Кейс считается пройденным, если:

- `mean_abs <= max_mean_abs`;
- `changed_ratio <= max_changed_ratio`.

## Конфигурация кейсов

Файл: `parity/cases.toml`.

- секция `[meta]`: глобальные дефолты;
- `[[case]]`: параметры конкретной модели и путь к эталонному PNG.

Эталонные кадры хранятся в `parity/reference/`.

## Локальный запуск

```bash
cargo run -p render-parity -- \
  --manifest parity/cases.toml \
  --output-dir target/render-parity/current
```

При расхождении утилита пишет diff-изображение в:

- `target/render-parity/current/diff/<case>.png`

## CI-модель

CI запускает `render-parity` на каждом push/PR:

1. собирает `parkan-render-demo`;
2. прогоняет кейсы из `cases.toml`;
3. при падении публикует текущие кадры и diff как артефакт.

Важно: оригинальный движок в CI обычно не запускается.  
Эталонные PNG снимаются офлайн и версионируются в репозитории.