#version 330 core // Transform Feedback available in 330+ layout (location = 0) in vec2 aPos; // Dummy input vertex position (we don't use it) uniform sampler2D InputTexture; // Linear Float texture (e.g., RGBA16F) // Output to Geometry Shader out VS_OUT { vec3 linearColor; } vs_out; void main() { // We use gl_VertexID to figure out which texel to read ivec2 textureSize = textureSize(InputTexture, 0); ivec2 texelCoord = ivec2(gl_VertexID % textureSize.x, gl_VertexID / textureSize.x); // Boundary check (important if drawing more vertices than pixels) if (texelCoord.x >= textureSize.x || texelCoord.y >= textureSize.y) { vs_out.linearColor = vec3(-1.0); // Indicate invalid pixel } else { vs_out.linearColor = texture(InputTexture, vec2(texelCoord) / vec2(textureSize)).rgb; } // We don't output gl_Position as rasterization is disabled }