#version 430 core out vec4 FragColor; uniform vec2 u_resolution; // framebuffer size in pixels uniform ivec2 u_gridSize; // sand grid size uniform usampler2D u_state; // GL_R8UI texture void main() { vec2 fragCoord = gl_FragCoord.xy; // Normalized coordinates vec2 uv = fragCoord / u_resolution; uv.y = 1.0 - uv.y; // Map to grid coordinates ivec2 cell = ivec2(uv * vec2(u_gridSize)); cell = clamp(cell, ivec2(0), u_gridSize - ivec2(1)); uint v = texelFetch(u_state, cell, 0).r; vec3 color = (v == 1u) ? vec3(0.9, 0.8, 0.1) // sand : vec3(0.05, 0.05, 0.10); // background FragColor = vec4(color, 1.0); }