layout(constant_id = 0) const int width = 25; layout(constant_id = 1) const int height = 25; layout(location = 0) out vec2 outUV; layout(location = 1) out flat ivec2 outPixel; layout(location = 2) out float outDepth; layout(binding = 1) uniform sampler2D depth_sampler; layout(push_constant, binding = 2) uniform readonly PushConstant{ vec4 params; }; void main() { outUV = vec2((gl_VertexIndex << 1) & 2, gl_VertexIndex & 2); ivec2 pixel = ivec2(gl_InstanceIndex % width, gl_InstanceIndex / width); outPixel = pixel; const float depth = texture(depth_sampler, vec2(pixel) / vec2(width, height)).r; outDepth = depth; vec2 pos = vec2(outUV * 2.0 + -1.0); // far field mode if(params.y == 0) { pos *= params.x * depth; } pos += vec2(pixel.x, pixel.y); pos *= 2.0 / vec2(width, height); pos += vec2(-1, -1); gl_Position = vec4(pos.x, pos.y, 0.0, 1.0); }