Landscape 2D/3D shared one fragment shader with the city's fog, window and beacon code. Building two variants from the same source with a CITY define brought 3D frame cost back near its pre-city level in the profiling setup (native 708 -> ~300 ms/frame under software GL, JS and canvas 71 -> ~33 ms/frame).