27
$\begingroup$

I'm new to shaders and know that you can color pixels with gl_FragColor but sometimes there is this thing:

vec2 uv = gl_FragCoord.xy / screenSize; // or resolution or smthn depends on the implementation

If gl_FragCoord is like pixel coordinates, what does uv get?

Why is it often done in GLSL?

If someone could even draw an example of which part of the screen will be UV it will be very helpful!

$\endgroup$
1
  • $\begingroup$ It is important to note that the Rasterization stage before the optional Fragment Shader performs fragment attribute interpolation and viewport transformation for the gl_FragCoord attribute. $\endgroup$
    – Matthias
    Commented Oct 14, 2017 at 16:29

2 Answers 2

35
$\begingroup$

First, gl_FragCoord.xy are screen space coordinates of current pixel based on viewport size. So if viewport size is width=5, height=4 then each fragment contains:

enter image description here

Why are uvs needed? For example I rendered geometry to screen quad and then I need to apply some postprocessing on this quad in another rendering pass. To sample from that quad I need texture coordinates in range [0, 1]. So to calculate them I perform division gl_FragCoord.xy / viewPortSize.

$\endgroup$
1
  • 1
    $\begingroup$ It might be worth saying that GL_TEXTURE_RECTANGLE_ARB doesn't use normalized coordinates, but that GL_TEXTURE_*D textures do. $\endgroup$ Commented Feb 13, 2019 at 5:42
6
$\begingroup$

Refer to narthex's excellent answer for details and example, but simply put,

If you want to map the pixel coordinate values to the range 0 to 1 , you divide by viewPortSize.

$\endgroup$

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Not the answer you're looking for? Browse other questions tagged or ask your own question.