74 lines
3.1 KiB
Markdown
74 lines
3.1 KiB
Markdown
# Render frame
|
||
|
||
Кадр является последней стадией цикла, а не самостоятельной функцией renderer-а.
|
||
До draw calls уже накоплен input, рассчитан tick, применены отложенные операции,
|
||
выбрана камера и обновлён 3D sound listener.
|
||
|
||
## Frame skeleton
|
||
|
||
```text
|
||
system messages and input
|
||
-> simulation calculation
|
||
-> deferred object operations
|
||
-> animation and transforms
|
||
-> camera and sound listener
|
||
-> visibility and render queues
|
||
-> materials and draw passes
|
||
-> renderer completion
|
||
-> end-of-render callbacks and UI
|
||
```
|
||
|
||
В `World3D::stdRenderGame` доказан крупный порядок: camera передаётся Terrain,
|
||
настраиваются viewport/matrices, вызываются renderer boundary slots,
|
||
устанавливается `in_render`, выполняется traversal мира, закрывается world/shade
|
||
pass, вызывается renderer completion, снимается `in_render`, рассылается
|
||
end-of-render.
|
||
|
||
## Draw item
|
||
|
||
Подготовленный draw item содержит:
|
||
|
||
- node world matrix;
|
||
- batch flags and index range;
|
||
- WEAR material handle;
|
||
- MAT0 active phase and coefficients;
|
||
- texture handle;
|
||
- optional lightmap handle;
|
||
- render phase and sorting key;
|
||
- legacy pipeline state.
|
||
|
||
Подготовленный item должен ссылаться на immutable данные кадра. Изменение phase
|
||
или texture cache посреди прохода не должно менять уже собранную очередь.
|
||
|
||
## GOG camera dispatch evidence
|
||
|
||
For the GOG `World3D.dll` baseline with SHA-256
|
||
`17e4a3089b2583a8cf2356c9db0390b1aba138356a09130d79b4e7e4791da61e`,
|
||
the exported `stdRenderGame` is RVA `0x13BD0`. It first calls
|
||
`Terrain::stdSetCurrentCamera2(camera)`, stores the camera pointer only for
|
||
the frame, and clears it before return. `sendEndOfRender` is a separate export
|
||
at RVA `0x13D90`. This is frame-order evidence only: the camera ABI, matrices
|
||
and viewport values still require dynamic capture or further decompilation.
|
||
|
||
Receiver-side GOG Terrain evidence refines this contract. `stdSetCurrentCamera2`
|
||
(RVA `0x4FD40` in Terrain SHA-256
|
||
`af87d1b2e728a0be73c52be3b44cc196ab46da7799f25a15d40f8c9b0b425ead`) queries
|
||
selector `18` on the supplied object and invokes slot `+12` on that result. It
|
||
does not store the supplied pointer in `stdGetCurrentCamera2`; that getter
|
||
returns a Terrain global populated by selector `8` during Terrain initialization.
|
||
|
||
## Parity risks
|
||
|
||
- x87 precision and rounding;
|
||
- scalar/SIMD `g_FastProc` differences;
|
||
- object, batch and transparent primitive order;
|
||
- depth, cull, alpha test and blend transitions;
|
||
- mip-skip, palette and Page coordinates;
|
||
- material fallback and phase selection;
|
||
- RNG sequence for FX and atmosphere;
|
||
- device capability fallback;
|
||
- simulation time quantization.
|
||
|
||
Для отладки нужен deterministic frame capture: camera state, visible object IDs,
|
||
draw-item list, pipeline keys, matrices и hashes промежуточных buffers.
|