#version 330 core in vec2 vUV; in vec3 vWorldPos; out vec4 FragColor; uniform sampler2D uHeightTex; uniform float uMinV; uniform float uMaxV; uniform float uHeightScale; uniform vec2 uTexelSize; uniform vec2 uPlaneSize; uniform vec3 uCameraPos; uniform vec3 uLightDir; uniform vec3 uColorZero; uniform vec3 uColorLow; uniform vec3 uColorMid; uniform vec3 uColorHigh; float saturate(float x) { return clamp(x, 0.0, 1.0); } float value01(float v) { return saturate((v - uMinV) / max(uMaxV - uMinV, 1e-6)); } float maxNeighborValue(vec2 uv)