Fragment Shader/Defined Inputs

The location of the fragment in window space. The X, Y and Z components are the window-space position of the fragment. The Z value will be written to the depth buffer if gl_FragDepth​ is not written to by this shader stage. The W component of gl_FragCoord​ is 1/Wclip, where Wclip is the interpolated W component of the clip-space vertex position output to gl_Position​ from the last Vertex Processing stage.

The space of gl_FragCoord​ can be modified by redeclaring gl_FragCoord​ with special input layout qualifiers:

layout(origin_upper_left)invec4gl_FragCoord;

This means that the origin for gl_FragCoord​'s window-space will be the upper-left of the screen, rather than the usual lower-left.

layout(pixel_center_integer​)invec4gl_FragCoord;

OpenGL window space is defined such that pixel centers are on half-integer boundaries. So the center of the lower-left pixel is (0.5, 0.5). Using pixel_center_integer​​ adjust gl_FragCoord​ such that whole integer values represent pixel centers.

Both of these exist to be compatible with D3D's window space. Unless you need your shaders to have this compatibility, you are advised not to use these features.

gl_FrontFacing​

This is true if this fragment was generated by the front-face of the primitive; it is false if it was generated by the back-face. Only triangle Primitives have a back face; fragments generated by all other primitives will always have this be set to true​.

gl_PointCoord​

The location within a point primitive that defines the position of the fragment relative to the side of the point. Points are effectively rasterized as window-space squares of a certain pixel size. Since points are defined by a single vertex, the only way to tell where in that square a particular fragment is is with gl_PointCoord​.

This is an integer identifier for the current sample that this fragment is rasterized for.

Warning: Any use of this variable at all will force this shader to be evaluated per-sample. Since much of the point of multisampling is to avoid that, you should use it only when you must.

gl_SamplePosition​

This is the location of the current sample for the fragment within the pixel's area, with values on the range [0, 1]. The origin is the bottom-left of the pixel area.

Warning: Any use of this variable at all will force this shader to be evaluated per-sample. Since much of the point of multisampling is to avoid that, you should use it only when you must.

gl_SampleMaskIn​

When using multisampling, this variable contains a bitfield for the sample mask of the fragment being generated. The array is as long as needed to fill in the number of samples supported by the GL implementation.

Some Fragment shader built-in inputs will take values specified by OpenGL, but these values can be overridden by user control.

infloatgl_ClipDistance[];inintgl_PrimitiveID;

gl_ClipDistance​

This array contains the interpolated clipping plane half-spaces, as output for vertices from the last Vertex Processing stage.

gl_PrimitiveID​

This value is the index of the current primitive being rendered by this drawing command. This includes any Tessellation applied to the mesh, so each individual primitive will have a unique index.

However, if a Geometry Shader is active, then the gl_PrimitiveID​ is exactly and only what the GS provided as output. Normally, gl_PrimitiveID​ is guaranteed to be unique, so if two FS invocations have the same primitive ID, they come from the same primitive. But if a GS is active and outputs non-unique values, then different fragment shader invocations for different primitives will get the same value. If the GS did not output a value for gl_PrimitiveID​, then the fragment shader gets an undefined value.