perf(render3d): a depth prepass for the near tree foliage

Needle-card crowns are many cut-out quads deep and a discarding shader turns early depth
rejection off, so every card behind the front one ran the full lighting shader. The near
tree LODs now write depth first (depth.frag, the same alpha coverage test), terrain under
them is rejected before shading, and the lit pass draws them with no discard and an equal
depth test (invariant gl_Position). R3D_NOPREPASS=1 restores the old path.

Dense forest on a Windows PC: 61 -> 78 fps at 3840x2160, 116 -> 164 fps at 1920x1080.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
Orkun ÇAKILKAYA 2026-09-13 04:18:38 +03:00
parent 21bc611455
commit d6ffdfa638
6 changed files with 123 additions and 1 deletions

View file

@ -32,7 +32,12 @@ mat3 cotangentFrame(vec3 N, vec3 p, vec2 uv) {
}
void main() {
#ifndef EQ_PASS
// (the EQ_PASS variant draws over the foliage prepass: any discard at all would switch
// early depth rejection off and bring the overdraw back, and the prepass has already
// cut both the clip plane and the alpha)
if (v_wpos.y < u_clip_y) discard;
#endif
vec3 N = normalize(v_nrm);
if (!gl_FrontFacing && v_hull >= 0.0) N = -N;
#ifdef CARD