#version 450 // Vertex shader del pase de postprocesado. // Emite un solo triángulo que cubre toda la pantalla (técnica del "fullscreen // triangle"): tres vértices en (-1,-1), (3,-1), (-1,3) → la región visible // [-1..1]² queda completamente cubierta y el clip recorta el resto. No hace // falta vertex buffer; el draw es DrawPrimitives(vertex_count=3). layout(location = 0) out vec2 v_uv; void main() { vec2 positions[3] = vec2[3]( vec2(-1.0, -1.0), vec2( 3.0, -1.0), vec2(-1.0, 3.0) ); // UV.y invertida para compensar la diferencia entre la convención de // clip-space del line shader (ndc.y flipeado, GL-style) y la convención // de muestreo de SDL_gpu/Vulkan (origen de textura en top-left). Sin esta // inversión, el offscreen se ve cabeza-abajo en el composite. vec2 uvs[3] = vec2[3]( vec2(0.0, 1.0), vec2(2.0, 1.0), vec2(0.0, -1.0) ); gl_Position = vec4(positions[gl_VertexIndex], 0.0, 1.0); v_uv = uvs[gl_VertexIndex]; }