feat(render): add planar water reflections
Docs Deploy / Build and Deploy MkDocs (push) Successful in 1m22s

This commit is contained in:
Valentin Popov committed 2026-11-01 05:31:43 +04:00
1 parent 2de24962e0
commit dfa2db65cc
17 files changed
+905 -191

No files matched your search

+30
View File
@@ -1138,6 +1138,36 @@ lightmap state передаются в `VulkanStaticMaterial`, а shader пос
сэмплирует эти четыре стадии. Animation clock обновляет выбранные фазы и
коэффициенты без пересборки terrain mesh, сохраняя native type-14 overlay mask.
### Отражение на воде
Поверхность воды нельзя рисовать тем же умножением текстур, что и землю.
В проходе ландшафта GOG Terrain.dll флаг грани `0x20000` участвует в выборе
отражения; при включённом EMBM живой водный кадр использует texture mode 10.
Оригинал создаёт для этого отдельную камеру `REFLECTION_SHIFTED`.
В [эталонной сборке](../reference/original-binaries.md) выбор грани находится
в Terrain.dll RVA `0x28A50`, а подготовка EMBM-пакета — в RVA `0x1B540`.
Первый Vulkan-проход строит плоское зеркало. Для горизонтальной воды на
высоте `h` отражённая координата точки равна `z′ = 2h − z`. Это преобразование
применяется перед обычной проекцией. Оно меняет порядок вершин треугольника,
поэтому проход меняет сторону отсечения и отбрасывает геометрию ниже воды.
Небо и оставшаяся сцена попадают в отдельную цветовую текстуру с собственной
глубиной. В основном проходе водные треугольники читают её в экранной
координате: точки самой плоскости не сдвигаются при отражении.
Цветовой target переходит из attachment layout в shader-read layout после
записи. Следующий зеркальный проход ждёт предыдущего чтения этой текстуры;
основной и отражённый виды используют разные слоты uniform buffer. Во время
записи отражения привязан отдельный нейтральный descriptor, чтобы проход
не читал собственное вложение.
Такое зеркало ещё не повторяет shifted-камеру и EMBM оригинала: искажение
отражения волнами пока отсутствует и учитывается в
`planar_reflection_embm_unsupported`. Один target обслуживает ближайшую
активную высоту воды; другие высоты и негоризонтальные поверхности явно
считаются как неподдержанные. Это промежуточный водный проход, а не полная
приёмка воды или лавы.
## Реализация Vulkan
`LegacyPipelineState` хранит blend, depth, cull и alpha-test. Из этих значений