OverviewFilesCommitsIssuesDocsReleasesPeers

hyper-tps / lod_debug.gdshader

38 lines · gdshader ref:
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;
}