Context
A first-person horror game shows arms + flashlight/weapon in view. Rendered naively in the main pass, the viewmodel clips through walls the moment the player faces one, and the world FOV (often 90°+) distorts it. Every FPS engine renders the viewmodel as a separate layer; Vortex has no such concept — the render sequence is fixed (3D scene → motion vectors → upscale → UI).
Goal
A viewmodel render layer: entities flagged 'first-person' render after the world with depth cleared or remapped to a near range, using their own FOV (e.g. 54°), still receiving the scene lighting (flashlight self-illumination case) and still producing motion vectors so DLSS SR/FG doesn't ghost the weapon.
Acceptance Criteria
Technical Notes
Simplest robust order: render world → clear depth → render viewmodel with own proj → continue with mvec/post. Motion-vector pass needs the same dual-projection handling (motionvector.hlsl reprojection with viewmodel matrices). Mind the render-scale offscreen RT: viewmodel renders into the same scaled RT.
Dependencies
- rendering: spot light shadow mapping (the flashlight) — for receive-shadows interaction (soft)
- animation: bone socket system (weapon attached to arms rig)
Context
A first-person horror game shows arms + flashlight/weapon in view. Rendered naively in the main pass, the viewmodel clips through walls the moment the player faces one, and the world FOV (often 90°+) distorts it. Every FPS engine renders the viewmodel as a separate layer; Vortex has no such concept — the render sequence is fixed (3D scene → motion vectors → upscale → UI).
Goal
A viewmodel render layer: entities flagged 'first-person' render after the world with depth cleared or remapped to a near range, using their own FOV (e.g. 54°), still receiving the scene lighting (flashlight self-illumination case) and still producing motion vectors so DLSS SR/FG doesn't ghost the weapon.
Acceptance Criteria
Technical Notes
Simplest robust order: render world → clear depth → render viewmodel with own proj → continue with mvec/post. Motion-vector pass needs the same dual-projection handling (
motionvector.hlslreprojection with viewmodel matrices). Mind the render-scale offscreen RT: viewmodel renders into the same scaled RT.Dependencies