shader_type spatial;
render_mode cull_back;
// Color terrain by LOD level — derives LOD from triangle size
// Larger triangles = coarser LOD = warmer colors
void fragment() {
// Screen-space derivatives of world position give triangle density
vec3 wp = (INV_VIEW_MATRIX * vec4(VERTEX, 1.0)).xyz;
float ddx = length(dFdx(wp));
float ddy = length(dFdy(wp));
float pixel_size = max(ddx, ddy);
// Estimate LOD level from pixel footprint (log2 of voxel size ratio)
// LOD0 ~ 1m pixels, LOD1 ~ 2m, LOD2 ~ 4m, etc.
float lod = clamp(log2(pixel_size * 2.0), 0.0, 7.0);
float t = lod / 7.0;
// Color ramp: green(LOD0) → cyan → yellow → orange → red → purple(LOD7)
vec3 colors[8] = vec3[](
vec3(0.2, 0.8, 0.2), // LOD0: green (finest)
vec3(0.2, 0.6, 0.8), // LOD1: cyan
vec3(0.8, 0.8, 0.2), // LOD2: yellow
vec3(0.8, 0.4, 0.1), // LOD3: orange
vec3(0.8, 0.2, 0.2), // LOD4: red
vec3(0.6, 0.2, 0.8), // LOD5: purple
vec3(0.2, 0.2, 0.8), // LOD6: blue
vec3(0.8, 0.6, 0.8) // LOD7: pink
);
int i0 = int(floor(lod));
int i1 = min(i0 + 1, 7);
float f = fract(lod);
ALBEDO = mix(colors[i0], colors[i1], f);
ROUGHNESS = 1.0;
METALLIC = 0.0;
}