fix(render): fade MSH portals with camera distance
Docs Deploy / Build and Deploy MkDocs (push) Successful in 36s
Docs Deploy / Build and Deploy MkDocs (push) Successful in 36s
This commit is contained in:
7 files changed
+382
-44
No files matched your search
@@ -41,6 +41,36 @@ geometry и projected shadows пересобираются для нового
|
||||
выбирается после успешного представления кадра; пауза нулевого drawable не
|
||||
добавляет время.
|
||||
|
||||
## Прозрачность порталов MSH
|
||||
|
||||
GOG `Terrain.dll` (SHA-256
|
||||
`af87d1b2e728a0be73c52be3b44cc196ab46da7799f25a15d40f8c9b0b425ead`),
|
||||
RVA `0x1B0F0`, заменяет diffuse alpha пакета без type 16 с batch bit `0x0008`.
|
||||
При `0x0010` аргумент кривой — `sqrt(distance)`, границы — `2.6 / fov` и
|
||||
`7.7999997 / fov`, наклон — `fov / (7.7999997 - 2.6)`. Без этого бита
|
||||
`0x0040` задаёт ноль; иначе границы — `75 * 1.3 / fov`, `95 * 1.3 / fov`,
|
||||
наклон — `fov / (95 * 1.3 - 75 * 1.3)`. До ближней границы alpha равна нулю,
|
||||
после дальней — единице. Внутри перехода alpha равна произведению смещения от
|
||||
ближней границы на наклон. Это замена alpha MAT0, а не дополнительный множитель.
|
||||
|
||||
Метод расстояния `0x246A0` через `0x247B0` читает первую индексированную
|
||||
вершину пакета, преобразует её в мир и вычисляет квадрат расстояния до камеры.
|
||||
Текущий Ngi32 dispatch `FastProc+0x2C` указывает на RVA `0x1D6D0`:
|
||||
`RSQRTSS` возвращает приближение обратного корня, которое умножается на квадрат
|
||||
расстояния. Получается приближённое евклидово расстояние; дополнительный `FSQRT`
|
||||
ветви `0x0010` выполняется уже над ним. Хеш Ngi32 —
|
||||
`bab9840d94f4e4e74ffc26677724fa896cf4823845504d09a9e025f80016edf5`.
|
||||
Скаляр камеры в шестом float getter `0x4F5F0` и поле CShade `+0xBB4`
|
||||
проверены в работающем оригинале: оба содержат текущий горизонтальный FOV.
|
||||
|
||||
`legacy_msh_portal_alpha` хранит кривую в `fparkan-render`. Приложение пока
|
||||
берёт первую индексированную вершину своего диапазона и обычный `sqrt`,
|
||||
поэтому выбор вершины после native CPU clipping и точность `RSQRTSS` не
|
||||
воспроизводятся. Счётчик `render_coverage portal_fade_packet_selection_approx`
|
||||
показывает число таких диапазонов. Поток type 16 сохраняет прежний отдельный
|
||||
путь и ещё не декодирован. Это ограничивает приёмку на частично отсечённых
|
||||
порталах и не позволяет считать интерьер принятой эталонной сценой.
|
||||
|
||||
## Элемент отрисовки
|
||||
|
||||
Подготовленный элемент отрисовки содержит:
|
||||
|
||||
Reference in new issue
Block a user