| Name | 
 |  | 
 |     ARB_fragment_coord_conventions | 
 |  | 
 | Name Strings | 
 |  | 
 |     GL_ARB_fragment_coord_conventions | 
 |  | 
 | Contributors | 
 |  | 
 |     Jason Green, TransGaming | 
 |     Daniel Koch, TransGaming | 
 |     Gavriel State, TransGaming | 
 |     Ryan Gordon, Destineer | 
 |     Nicholas Vining, Destineer | 
 |     John Kessenich, Intel | 
 |  | 
 | Contact | 
 |  | 
 |     Mark Kilgard, NVIDIA (mjk 'at' nvidia.com) | 
 |     Daniel Koch, TransGaming (daniel 'at' transgaming.com) | 
 |  | 
 | Notice | 
 |  | 
 |     Copyright (c) 2009-2013 The Khronos Group Inc. Copyright terms at | 
 |         http://www.khronos.org/registry/speccopyright.html | 
 |  | 
 | Specification Update Policy | 
 |  | 
 |     Khronos-approved extension specifications are updated in response to | 
 |     issues and bugs prioritized by the Khronos OpenGL Working Group. For | 
 |     extensions which have been promoted to a core Specification, fixes will | 
 |     first appear in the latest version of that core Specification, and will | 
 |     eventually be backported to the extension document. This policy is | 
 |     described in more detail at | 
 |         https://www.khronos.org/registry/OpenGL/docs/update_policy.php | 
 |  | 
 | Status | 
 |  | 
 |     Complete. Approved by the ARB on July 3, 2009. | 
 |  | 
 | Version | 
 |  | 
 |     Last Modified Date:  August 2, 2009 | 
 |     Version:             10 | 
 |  | 
 | Number | 
 |  | 
 |     ARB Extension #63 | 
 |  | 
 | Dependencies | 
 |  | 
 |     This extension is written against the OpenGL 3.1 Specification but | 
 |     can apply to prior specifications. | 
 |  | 
 |     This extension interacts with ARB_fragment_program. | 
 |  | 
 |     This extension interacts with ARB_fragment_shader. | 
 |  | 
 |     This extension interacts with NV_fragment_program. | 
 |  | 
 |     This extension interacts with NV_fragment_program_option. | 
 |  | 
 |     This extension interacts with NV_fragment_program2. | 
 |  | 
 |     This extension interacts with NV_fragment_program4. | 
 |  | 
 | Overview | 
 |  | 
 |     This extension provides alternative conventions for the fragment | 
 |     coordinate XY location available for programmable fragment processing. | 
 |  | 
 |     The scope of this extension deals *only* with how the fragment | 
 |     coordinate XY location appears during programming fragment processing. | 
 |     Beyond the scope of this extension are coordinate conventions used | 
 |     for rasterization or transformation. | 
 |  | 
 |     In the case of the coordinate conventions for rasterization and | 
 |     transformation, some combination of the viewport, depth range, culling | 
 |     state, and projection matrix state can be reconfigured to adopt other | 
 |     arbitrary clip-space and window-space coordinate space conventions. | 
 |     Adopting other clip-space and window-space conventions involves | 
 |     adjusting existing OpenGL state.  However it is non-trivial to massage | 
 |     an arbitrary fragment shader or program to adopt a different | 
 |     window-space coordinate system because such shaders are encoded in | 
 |     various textual representations. | 
 |  | 
 |     The dominant 2D and 3D rendering APIs make two basic choices of | 
 |     convention when locating fragments in window space. | 
 |  | 
 |     The two choices are: | 
 |  | 
 |     1)  Is the origin nearest the lower-left- or upper-left-most pixel | 
 |         of the window? | 
 |  | 
 |     2)  Is the (x,y) location of the pixel nearest the origin at (0,0) | 
 |         or (0.5,0.5)? | 
 |  | 
 |     OpenGL assumes a lower-left origin for window coordinates and assumes | 
 |     pixel centers are located at half-pixel coordinates.  This means | 
 |     the XY location (0.5,0.5) corresponds to the lower-left-most pixel | 
 |     in a window. | 
 |  | 
 |     Other window coordinate conventions exist for other rendering APIs. | 
 |     X11, GDI, and Direct3D version through DirectX 9 assume an upper-left | 
 |     window origin and locate pixel centers at integer XY values. | 
 |     By this alternative convention, the XY location (0,0) corresponds | 
 |     to the upper-left-most pixel in a window. | 
 |  | 
 |     Direct3D for DirectX 10 assumes an upper-left origin (as do prior | 
 |     DirectX versions) yet assumes half-pixel coordinates (unlike prior | 
 |     DirectX versions).  By the DirectX 10 convention, the XY location | 
 |     (0.5,0.5) corresponds to the upper-left-most pixel in a window. | 
 |  | 
 |     Fragment shaders can directly access the location of a given | 
 |     processed fragment in window space.  We call this location the | 
 |     "fragment coordinate". | 
 |  | 
 |     This extension provides a means for fragment shaders written in GLSL | 
 |     or OpenGL assembly extensions to specify alternative conventions | 
 |     for determining the fragment coordinate value accessed during | 
 |     programmable fragment processing. | 
 |  | 
 |     The motivation for this extension is to provide an easy, efficient | 
 |     means for fragment shaders accessing a fragment's window-space | 
 |     location to adopt the fragment coordinate convention for which the | 
 |     shader was originally written. | 
 |  | 
 | New Procedures and Functions | 
 |  | 
 |     None | 
 |  | 
 | New Tokens | 
 |  | 
 |     None | 
 |  | 
 | Additions to Chapter 2 of the OpenGL 3.1 Specification (OpenGL Operation) | 
 |  | 
 |     None | 
 |  | 
 | Additions to Chapter 3 of the OpenGL 3.1 Specification (Rasterization) | 
 |  | 
 |     Modify Section 3.9.2, "Shader Execution" | 
 |  | 
 |     In subsection "Shader Inputs" replace the paragraph beginning "The | 
 |     built-in variable gl_FragCoord ..." with: | 
 |  | 
 |     "The built-in variable gl_FragCoord holds the fragment coordinate | 
 |     (x_f,y_f,z_f,w_f) for the fragment.  Computing the fragment coordinate | 
 |     depends on the fragment processing pixel-center and origin conventions | 
 |     (discussed below) as follows: | 
 |  | 
 |               { x_w - 0.5,   if the fragment processing pixel-center | 
 |        x_f  = {                 convention is integer | 
 |               { x_w,         otherwise | 
 |  | 
 |               { H - y_w,     if the fragment processing origin | 
 |        y_f' = {                 convention is upper-left | 
 |               {     y_w,     otherwise | 
 |  | 
 |               { y_f' - 0.5,  if the fragment processing pixel-center | 
 |        y_f  = {                 convention is integer | 
 |               { y_f',        otherwise | 
 |  | 
 |        z_f  = z_w | 
 |  | 
 |        w_f  = 1 / w_c | 
 |  | 
 |     where (x_w, y_w, z_w) is the fragment's window-space position, w_c | 
 |     is the w component of the fragment's clip-space position, and H is | 
 |     the window's height in pixels. Note that the value of z_w already | 
 |     has a polygon offset added in, if enabled (see section 3.6.4). Also | 
 |     z_f must be precisely 0 or 1 in the case where z_w is either 0 or 1 | 
 |     respectively. The 1/w is computed from the w_c coordinate (see | 
 |     section 2.12), which is the result of the product of the projection | 
 |     matrix and the vertex's eye coordinates. | 
 |  | 
 |     Unless otherwise specified by layout qualifiers in the fragment | 
 |     shader (see section 4.3.x.1 "Input Layout Qualifier" of the OpenGL | 
 |     Shading Language Specification), the fragment processing | 
 |     pixel-center convention is half-integer and the fragment processing | 
 |     origin convention is lower-left." | 
 |  | 
 | Additions to Chapter 4 of the OpenGL 3.1 Specification (Per-Fragment | 
 | Operations and the Frame Buffer) | 
 |  | 
 |     None | 
 |  | 
 | Additions to Chapter 5 of the OpenGL 3.1 Specification (Special | 
 | Functions) | 
 |  | 
 |     None | 
 |  | 
 | Additions to Chapter 6 of the OpenGL 3.1 Specification (State and | 
 | State Requests) | 
 |  | 
 |     None | 
 |  | 
 | Additions to the AGL/GLX/WGL Specifications | 
 |  | 
 |     None | 
 |  | 
 | Additions to version 1.40.07 of the OpenGL Shading Language Specification | 
 |  | 
 |     "A new preprocessor #define is added to the OpenGL Shading Language: | 
 |  | 
 |       #define GL_ARB_fragment_coord_conventions 1 | 
 |  | 
 |     Including the following line in a shader can be used to control the | 
 |     language features described in this extension: | 
 |  | 
 |       #extension GL_ARB_fragment_coord_conventions : <behavior> | 
 |  | 
 |     where <behavior> is as specified in section 3.3." | 
 |  | 
 | Additions to Chapter 4 of the OpenGL Shadering Language (Variables and Types) | 
 | version 1.40.07 | 
 |  | 
 |     Add a new Section 4.3.x (Layout Qualifiers) as follows: | 
 |  | 
 |     "4.3.x Layout Qualifiers | 
 |  | 
 |     Layout qualifiers can appear with an individual variable declared with | 
 |     an interface qualifier: | 
 |  | 
 |         <layout-qualifier> <interface-qualifier> <declaration>; | 
 |  | 
 |         <layout-qualifier>: | 
 |             layout( <layout-qualifier-id-list> ) | 
 |  | 
 |         <layout-qualifier-id-list>: | 
 |             comma separated list of <layout-qualifier-id> | 
 |  | 
 |         <interface-qualifier>: | 
 |             in | 
 |             out | 
 |             uniform | 
 |  | 
 |     Declarations of layouts can only be made at global scope, and only | 
 |     where indicated in the following subsection; their details are | 
 |     specific to what the interface qualifier is, and are discussed | 
 |     individually. | 
 |  | 
 |     The tokens in any <layout-qualifier-id-list> are identifiers, not | 
 |     keywords. Generally they can be listed in any order. Order-dependent | 
 |     meanings exist only if explicitly called out below. Similarily, | 
 |     these identifiers are not case-sensitive, unless explicitly noted | 
 |     otherwise. | 
 |  | 
 |     4.3.x.1 Input Layout Qualifiers | 
 |  | 
 |     Vertex shaders do not have any input layout qualifiers. | 
 |  | 
 |     Fragment shaders can have an input layout only for redeclaring the | 
 |     built-in variable gl_FragCoord (see section 7.2). The layout | 
 |     qualifier identifiers for gl_FragCoord are | 
 |  | 
 |         <layout-qualifier-id> | 
 |             origin_upper_left | 
 |             pixel_center_integer | 
 |  | 
 |     By default, gl_FragCoord assumes a lower-left origin for window | 
 |     coordinates and assumes pixel centers are located at half-pixel | 
 |     coordinates. For example, the (x, y) location (0.5, 0.5) is returned | 
 |     for the lower-left-most pixel in a window. The origin can be changed | 
 |     by redeclaring gl_FragCoord with the <origin_upper_left> identifier, | 
 |     moving the origin of gl_FragCoord to the upper left of the window, | 
 |     with y increasing in value toward the bottom of the window. The | 
 |     values returned can also be shifted by half a pixel in both x and y | 
 |     by the <pixel_center_integer> identifier so it appears the pixels | 
 |     are centered at whole number pixel offsets. This moves the (x, y) | 
 |     value returned by gl_FragCoord of (0.5, 0.5) by default, to (0.0, | 
 |     0.0) with <pixel_center_integer>. Redeclarations are done as follows | 
 |  | 
 |         in vec4 gl_FragCoord;  // redeclaration that changes nothing is allowed | 
 |  | 
 |         // All the following are allowed redeclarations that change behavior | 
 |         layout(origin_upper_left) in vec4 gl_FragCoord; | 
 |         layout(pixel_center_integer) in vec4 gl_FragCoord; | 
 |         layout(origin_upper_left, pixel_center_integer) in vec4 gl_FragCoord; | 
 |  | 
 |     If gl_FragCoord is redeclared in any fragment shader in a program, | 
 |     it must be redeclared in all the fragment shaders in that program | 
 |     that have a static use of gl_FragCoord. All redeclarations of | 
 |     gl_FragCoord in all fragment shaders in a single program must have | 
 |     the same set of qualifiers. Within any shader, the first | 
 |     redeclarations of gl_FragCoord must appear before any use of | 
 |     gl_FragCoord. The built-in gl_FragCoord is only predeclared in | 
 |     fragment shaders, so redeclaring it in any other shader language | 
 |     will be illegal. | 
 |  | 
 |     Redeclaring gl_FragCoord with <origin_upper_left> and/or | 
 |     <pixel_center_integer> qualifiers only affects gl_FragCoord.x and | 
 |     gl_FragCoord.y. It has no affect on rasterization, transformation, | 
 |     or any other part of the OpenGL pipeline or language features." | 
 |  | 
 |  | 
 | Dependencies on ARB_fragment_program extension | 
 |  | 
 |     3.11.3.1  Fragment Attributes | 
 |  | 
 |     Modify this paragraph: | 
 |  | 
 |     "If a fragment attribute binding matches "fragment.position", the "x" | 
 |     and "y" components of the fragment attribute variable are filled | 
 |     with the (x,y) window coordinates of the fragment center, relative | 
 |     to the lower left corner of the window.  The "z" component is filled | 
 |     with the fragment's z window coordinate.  This z window coordinate | 
 |     undergoes an implied conversion to floating point.  This conversion | 
 |     must leave the values 0 and 1 invariant.  The "w" component is | 
 |     filled with the reciprocal of the fragment's clip w coordinate." | 
 |  | 
 |     to read: | 
 |  | 
 |     "If a fragment attribute binding matches "fragment.position", the "x", | 
 |     "y", "z", and "w" components of the fragment attribute variable are | 
 |     filled with the (f_x,f_y,f_z,f_w) components respectively of the | 
 |     fragment coordinate for the fragment." | 
 |  | 
 |     Add this section: | 
 |  | 
 |    "3.11.4.5.3  Fragment Coordinate Conventions Fragment Program Options | 
 |  | 
 |     These options affect the fragment coordinate conventions specified | 
 |     in the "Shader Inputs" subsection of section 3.11. | 
 |  | 
 |     If a fragment program specifies one of the option | 
 |     "ARB_fragment_coord_origin_upper_left", the fragment processing origin | 
 |     convention is upper-left (and otherwise is lower-left) for purposes of | 
 |     computing the fragment coordinate when the fragment program executes. | 
 |  | 
 |     If a fragment program specifies one of the option | 
 |     "ARB_fragment_coord_pixel_center_integer", the fragment processing | 
 |     pixel-center convention is integer (and otherwise is half-integer) | 
 |     for purposes of computing the fragment coordinate when the fragment | 
 |     program executes." | 
 |  | 
 | Dependencies on NV_fragment_program extension | 
 |  | 
 |     When this extension is supported, modify the NV_fragment_program | 
 |     grammar to include: | 
 |  | 
 |     <program>              ::= <progPrefix> <optionSequence> <instructionSequence> "END" | 
 |  | 
 |     <optionSequence>       ::= <optionSequence> <option> | 
 |                              | "" | 
 |  | 
 |     <option>               ::= "OPTION" "ARB_fragment_coord_origin_upper_left" ";" | 
 |                              | "OPTION" "ARB_fragment_coord_pixel_center_integer" ";" | 
 |  | 
 |  | 
 |     Section 3.11.1.1, Fragment Program Attribute Registers | 
 |  | 
 |     Modify this paragraph: | 
 |  | 
 |     "f[WPOS].x and f[WPOS].y hold the (x,y) window coordinates of the | 
 |     fragment center, and relative to the lower left corner of the window. | 
 |     f[WPOS].z holds the associated z window coordinate, normally in the | 
 |     range [0,1].  f[WPOS].w holds the reciprocal of the associated clip | 
 |     w coordinate." | 
 |  | 
 |     to read: | 
 |  | 
 |     "The f[WPOS] register holds the components (x_f,y_f,z_f,w_f) | 
 |     respectively of the fragment coordinate described in the "Shader | 
 |     Inputs" subsection of section 3.11 (Fragment Shaders). | 
 |  | 
 |     If the ARB_fragment_coord_origin_upper_left OPTION is specified, the | 
 |     fragment processing origin convention is upper-left (and otherwise | 
 |     is lower-left) for purposes of computing the fragment coordinate | 
 |     when the fragment program executes. | 
 |  | 
 |     If the ARB_fragment_coord_pixel_center_integer OPTION is specified, | 
 |     the fragment processing pixel-center convention is integer (and | 
 |     otherwise is half-integer) for purposes of computing the fragment | 
 |     coordinate when the fragment program executes." | 
 |  | 
 | Dependencies on NV_fragment_program4 extension | 
 |  | 
 |     The language this extension adds for the ARB_fragment_program extension | 
 |     also applies to the NV_fragment_program4 extension.  Specifically: | 
 |  | 
 |     The language added to section 3.11.3.1 (Fragment Attributes) | 
 |     replaces corresponding language in section 2.X.3.2 (Program Attribute | 
 |     Variables). | 
 |  | 
 |     The language added to section 3.11.4.5.3 (Fragment Coordinate | 
 |     Conventions Fragment Program Options) belongs in section 2.X.5.Y | 
 |     (Fragment Program Options) of the NV_fragment_program4 extension. | 
 |  | 
 | Dependencies on ARB_compatibility | 
 |  | 
 |     If ARB_compatibility is not supported, delete the clause | 
 |     "which is the result of the product of the projection matrix and the | 
 |     vertex's eye coordinates" in the sentence describing the computation of | 
 |     1/w, in section 3.9.2. | 
 |  | 
 | Errors | 
 |  | 
 |     None | 
 |  | 
 | New State | 
 |  | 
 |     None | 
 |  | 
 | New Implementation Dependent State | 
 |  | 
 |     None | 
 |  | 
 | Issues | 
 |  | 
 |     1. What should this extension be called? | 
 |  | 
 |        RESOLVED:  ARB_fragment_coord_conventions. | 
 |  | 
 |        We use "fragment" instead of "frag" in the name because other | 
 |        extension names (ARB_fragment_program, ARB_fragment_shader) | 
 |        use the term fragment. | 
 |  | 
 |        We use "coord" to match the EXT_fog_coord extension's naming. | 
 |  | 
 |        We use "conventions" because the extension provides two alternative | 
 |        choices of convention:  upper-left origin (instead of lower-left) | 
 |        and integer pixel center locations (instead of half-integer). | 
 |  | 
 |     2. To what scope of OpenGL functionality should this extension apply? | 
 |  | 
 |        RESOLVED:  This extension is limited to how the XY window-space | 
 |        coordinates available to fragment shaders and programs are | 
 |        computed. | 
 |  | 
 |        This extension does NOT affect other 2D window coordinates such | 
 |        as those passed to the glViewport, glReadPixels, glCopyPixels, | 
 |        or glWindowsPos commands. | 
 |  | 
 |     3. What is the primary goal of this extension have? | 
 |  | 
 |        RESOLVED:  The goal is to increase the cross-API portability | 
 |        of fragment shaders.  Most fragment shader inputs (texture | 
 |        coordinate sets, colors) are treated identically among OpenGL | 
 |        and other 3D APIs such as the various versions of Direct3D. | 
 |        The chief exception is the fragment coordinate XY values which | 
 |        depend on the 3D API's particular window space conventions. | 
 |  | 
 |        We seek to avoid situations where shader source code must | 
 |        be non-trivially modified to support differing window-space | 
 |        conventions.  We also want minimize the performance effect on | 
 |        fragment shader execution.  Rather than an application modifying | 
 |        the shader source to add extra operations and parameters/uniforms | 
 |        to adjust the native window coordinate origin, we want to control | 
 |        the hardware's underlying convention for how the window origin | 
 |        is provided to the shader. | 
 |  | 
 |     4. Should this extension provide an API for programmatically | 
 |        specifying a global or per-program/shader setting for the window | 
 |        coordinate origin? | 
 |  | 
 |        RESOLVED:  No, the fragment coordinate conventions are specified | 
 |        within the GLSL fragment shader or assembly source text only. | 
 |  | 
 |        The choice of convention for the fragment coordinate is best | 
 |        specified within the program. | 
 |  | 
 |        Having a hierarchy of alternative ways to specify the window | 
 |        coordinate origin makes this extension more cumbersome than | 
 |        necessary and increases driver validation overhead. | 
 |  | 
 |        The expectation is that a fragment shader authored for an API | 
 |        with alternative fragment coordinate conventions is converted | 
 |        into an OpenGL fragment shader.  In this case, it's natural to | 
 |        simply provide a way within the shader to express the originally | 
 |        intended fragment coordinate convention. | 
 |  | 
 |     5. Should this extension allow the pixel-center and origin choices | 
 |        to be specified orthogonally? | 
 |  | 
 |        RESOLVED:  Yes. | 
 |  | 
 |        Direct3D versions prior to DirectX 10 have an integer pixel-center | 
 |        convention while DirectX 10 has a half-integer pixel-center | 
 |        convention though all Direct3D versions use the upper-left origin. | 
 |  | 
 |        While RenderMan lacks access to a fragment coordinate during | 
 |        shading, it uses an upper-left origin while the half-integer | 
 |        pixel-center convention is most consistent with RenderMan's | 
 |        rendering operation. | 
 |  | 
 |        The upper-left origin convention in combination with the | 
 |        half-integer pixel-center convention is also interesting for | 
 |        developing compositing window systems since window systems | 
 |        typically assume an upper-left origin but compositing operations | 
 |        based on texture mapping works best with half-integer pixel-center | 
 |        convention. | 
 |  | 
 |     6. Should there be pragmas and OPTIONs for specifying both the OpenGL | 
 |        convention and the non-OpenGL convention? | 
 |  | 
 |        RESOLVED:  Just provide pragmas and OPTIONS for the non-OpenGL | 
 |        conventions.  This avoids have to specify how multiple inconsistent | 
 |        conventions are resolved.  Inconsistent conventions are more | 
 |        problematic for GLSL because multiple shader objects may be | 
 |        specified with inconsistent conventions and the inconsistency is | 
 |        then deferred until program object linking. | 
 |  | 
 |        Just allowing the non-OpenGL convention to be specified is simpler. | 
 |        For GLSL, if any shader object has a non-OpenGL convention | 
 |        specified, the convention applies to the linked program object. | 
 |  | 
 |     7. Does this extension apply to the NV_fragment_program_option and | 
 |        NV_fragment_program2 extensions? | 
 |  | 
 |        RESOLVED:  Yes.  These two extensions depend on the | 
 |        ARB_fragment_program extension grammar which this extension | 
 |        amends. | 
 |  | 
 |     8. Should there be any API for querying the fragment coordinate | 
 |        conventions a given GLSL fragment shader or assembly fragment | 
 |        program requests? | 
 |  | 
 |        RESOLVED:  No. | 
 |  | 
 |        There are not queries for other pragmas and OPTIONs. | 
 |  | 
 |        The text for the shader or program can be queried and it is easy | 
 |        enough to parse the text to determine the behavior of the program. | 
 |  | 
 |     9. This extension adds no new command or new tokens.  Is that ok? | 
 |  | 
 |        RESOLVED:  Yes.  The functionality of this extension is exercised | 
 |        by enabling extensions and OPTIONs in fragment shader/program source | 
 |        text.  If the extension string is advertised, you can assume the | 
 |        specified syntax is parsed and put into effect. | 
 |  | 
 |    10. Does the window origin convention apply to EXT_framebuffer_object | 
 |        (FBO) and pixel buffer (pbuffer) rendering as well as window | 
 |        rendering? | 
 |  | 
 |        RESOLVED:  Yes. | 
 |  | 
 |    11. Should this instead be a global state at the API level? This | 
 |        means that, among other things, it will also affect the fixed | 
 |        function pipeline? | 
 |  | 
 |        RESOLVED: The scope of this extension deals *only* with how the | 
 |        fragment coordinate XY location appears during programming | 
 |        fragment processing. | 
 |  | 
 |        See the Overview's third paragraph for the rationale for this | 
 |        extension's scope. | 
 |  | 
 |    12. For an implementation that does compile-time compilation (as | 
 |        opposed to link-time or on-the-fly compilation), this would | 
 |        appear to require the compiler to emit code to do the | 
 |        transformation using internal uniforms regardless of whether it | 
 |        is needed or not, because any other shader that it is linked | 
 |        against may enable the pragma. | 
 |  | 
 |        Some possible alternatives, none of which is caveat-free: | 
 |        a) Require all fragment shaders to be consistent in the presence | 
 |           or absence of the pragma. That makes it impossible to link a | 
 |           shader written with the pragma against a stock shader that | 
 |           doesn't do anything with gl_FragCoord. | 
 |        b) Apply the pragma only within the shader it appears in. That | 
 |           removes the spooky action at a distance (where linking another | 
 |           shader in changes the behaviour of an existing one) - but if | 
 |           your hardware has some magic knobs to implement these pragmas, | 
 |           that may no longer be sufficient if there are multiple | 
 |           flavours of gl_FragCoord in the same program. | 
 |        c) Make this global state. See Issue 11. | 
 |  | 
 |        RESOLVED:  Because this extension's pragmas only support requesting | 
 |        a half-pixel fragment coordinate system and/or an upper-left | 
 |        coordinate system, there is no way for multiple fragment shader | 
 |        objects to specify an inconsistent fragment coordinate system. | 
 |        This means for a given set of fragment shaders being linked | 
 |        into a program object, there is exactly one fragment coordinate | 
 |        convention. | 
 |  | 
 |        (Fragment coordinate conventions are parsed and ignored for | 
 |        non-fragment shader objects.  Generating a warning in the info | 
 |        log when the pragma is ignored by non-fragment shader objects is | 
 |        a reasonable response in this situation.) | 
 |  | 
 |        Option b is not desirable because there should be exactly one | 
 |        convention within a single linked program object.  Each fragment | 
 |        shader object linked within a program object should not be allowed | 
 |        its own convention.  The expected usage is shaders written for | 
 |        DirectX 9 or 10 will be compiled with these pragmas appropriately; | 
 |        such shaders only need one convention.  This extension assumes | 
 |        implementations supporting this extension likely have hardware | 
 |        modes that support both the OpenGL, DirectX 9, and DirectX 10 | 
 |        conventions for a given fragment shader without require extra | 
 |        hidden uniforms. | 
 |  | 
 |        Option c is not desirable because the fragment coordinate | 
 |        convention really is a property of each shader rather than | 
 |        global state.  A shader assuming OpenGL's conventional lower-left | 
 |        convention expects to be able to add (0,1) to the fragment's | 
 |        (x,y) location and move "up" a pixel.  Whereas a similar shader | 
 |        coded for Direct3D would assume adding (0,1) to the fragment's | 
 |        (x,y) would move "down" a pixel.  Controlling the fragment | 
 |        coordinate convention from a global state setting is irrelevant to | 
 |        fixed-function processing (where the fragment coordinate position | 
 |        is never available). | 
 |  | 
 |        NOTE: much of the above discussion is largely irrelevant now that | 
 |        this extension uses layout qualifiers.  As noted in the | 
 |        shading language additions above, all redeclarations of gl_FragCoord | 
 |        must use the same set of qualifiers.  If a shader does not have a | 
 |        static use of gl_FragCoord it doesn't need to redeclare it. It is | 
 |        link-time error if multiple compilation units have inconsistent | 
 |        qualifiers. | 
 |  | 
 |    13. Is this "pragma" enough to provide DX compatibility? The | 
 |        following items may need to be addressed as well: | 
 |        a) edge rule: because of the y-inversion, rendering in DX mode or | 
 |           OGL mode is not equivalent (upper and lower edges are not | 
 |           rendered the same) | 
 |        b) gl_FragCoord value: this is addressed by this proposal | 
 |        c) viewport/scissor: if the shader is changed, it seems that | 
 |           there will be a mismatch with the value given to | 
 |           viewport/scissor which need to have the y-inversion as well. | 
 |        d) face ordering: if this adjusts the viewport, it will | 
 |           implicitly toggle the face ordering between CW and CCW. | 
 |        e) sample position? | 
 |  | 
 |        RESOLVED:  The scope of this extension deals *only* with how | 
 |        the fragment coordinate XY location appears during programming | 
 |        fragment processing. | 
 |  | 
 |        Trying to address these is a much bigger undertaking than was | 
 |        intended here, and is precisely why it was speced this way (to | 
 |        avoid touching these issues). | 
 |  | 
 |        See the Overview's third paragraph for the rationale for this | 
 |        extension's scope. | 
 |  | 
 |    14. Could this instead be done with functions (built-in or otherwise) | 
 |        in GLSL? Since the purpose of this extension seems to be to | 
 |        *ONLY* modify the gl_FragCoord when accessed in the fragment | 
 |        shader, couldn't one just write a GLSL function which does the | 
 |        same thing? | 
 |  | 
 |        RESOLVED:  The scope of this extension is really limited to | 
 |        support the straightforward translation of shaders written assuming | 
 |        Direct3D's fragment coordinate conventions into OpenGL. | 
 |  | 
 |        The intent is NOT to allow multiple conventions to be used with | 
 |        in the fragment domain of a single program object. | 
 |  | 
 |        The intent is also to support Direct3D's fragment coordinate | 
 |        conventions in a way that can leverage existing hardware modes | 
 |        used to support both OpenGL and Direct3D.  This is desirable | 
 |        because it avoids the introduction of extra "hidden" uniforms | 
 |        (to store a value such as the current window height). | 
 |  | 
 |        If you support a "different" gl_FragCoord or provide a function | 
 |        to return a Direct3D-style fragment coordinate, that introduces | 
 |        the possibility that multiple fragment coordinate conventions can | 
 |        exist in the same fragment shader program.  The pragma approach | 
 |        precludes this. | 
 |  | 
 |    15. Is the intent that the window origin convention is automatically | 
 |        adjusted for onscreen (in a window) vs offscreen rendering (FBOs | 
 |        or pbuffers)? ie if you have a fragment shader which is used with | 
 |        both onscreen and offscreen rendering is it the application's | 
 |        responsibility to track this and specify the appropriate window | 
 |        convention (and potentially recompile the shader), or does this | 
 |        happen automatically. | 
 |  | 
 |        RESOLVED:  The fragment coordinate convention is specified with | 
 |        respect to OpenGL window coordinates. | 
 |  | 
 |        This means developers don't need to be aware if they are rendering | 
 |        to a framebuffer object (FBO), pixel buffer (pbuffer), or window. | 
 |  | 
 |        The application doesn't have to "track" how the fragment shader | 
 |        is used. | 
 |  | 
 |        The expectation is that there is no need to recompile a fragment | 
 |        shader as the expectation is hardware modes exist to control the | 
 |        window space origin appropriately. | 
 |  | 
 |    16. Is there another way this could be specified other than a | 
 |        #pragma? Some people aren't keen on the use of a pragma for this. | 
 |        Other possibilities include providing a renamed gl_FragCoord with | 
 |        the different semantics, or allowing gl_FragCoord to be redefined | 
 |        in the shader with the desired qualifiers (similar to the | 
 |        invariant qualifier)? | 
 |  | 
 |        RESOLVED: Yes. This has been recast to use layout qualifiers | 
 |        originally introduced in GLSL 1.40 and extended in GLSL 1.50. | 
 |        However note that it is the intent of this extension to stand | 
 |        separately from the GLSL 1.40/1.50 and it is desinged to be | 
 |        implementable against GLSL 1.10 or 1.20. | 
 |  | 
 |    17. If this extension doesn't actually change how the window space | 
 |        positions are calculated and *only* modifies the gl_FragCoord | 
 |        which is visible in the fragment shader/program, how does this | 
 |        actually help an application which is using shaders which have | 
 |        the assumption of integer pixel centers baked in (and thus | 
 |        manually adjusting for the 0.5 offset) and which aren't accessing | 
 |        gl_FragCoord (or equivalent) directly? | 
 |  | 
 |        RESOLVED:  The scope of this extension deals *only* with how | 
 |        the fragment coordinate XY location appears during programming | 
 |        fragment processing. | 
 |  | 
 |        See the Overview's third paragraph for the rationale for this | 
 |        extension's scope. | 
 |  | 
 |        This extension simplifies the complicating task of converting | 
 |        OpenGL-style (lower-left, half-pixel) fragment coordinates to | 
 |        Direct3D-style fragment coordinates in a way that allows existing | 
 |        hardware mechanisms to support both OpenGL and Direct3D's | 
 |        conventions to be leveraged. In particular, "hidden" uniforms to | 
 |        track the current window height can be avoided when this is often | 
 |        already maintained by the hardware. | 
 |  | 
 | Revision History | 
 |  | 
 |     Rev.    Date    Author     Changes | 
 |     ----  -------- ---------  ---------------------------------------- | 
 |       1   1/08/07  mjk        Initial version | 
 |       2   11/5/08  mjk        Feedback from Destineer | 
 |       3   3/27/09  dgkoch     Add issue 11 | 
 |       4   5/01/09  dgkoch     fix typo, add discussion on issue 11 | 
 |                               add issues 12,13 based on comments from PB and BM | 
 |       5   5/07/09  dgkoch     Update issue 13, add issues 14-17 | 
 |       6   5/11/09  mjk        Work with Daniel Koch too: | 
 |                               Improve overview to clarify the extension's scope | 
 |                               Add resolutions to issues 11 through 17 | 
 |                               Change language to make clear that pragmas apply | 
 |                               to fragment shaders only; they are accepted but | 
 |                               totally ignored for other shader types | 
 |       7   5/15/09  dgkoch     fix date and a few typos | 
 |       8   5/19/09  dgkoch     renamed as ARB extension | 
 |       9   6/26/09  dgkoch     add #extension mechanism | 
 |                               recast GLSL using layout qualifiers as in GLSL 1.50 | 
 |                               synced up with GL3.2 changes/rebased on GL3.1 | 
 |                               updated some issue resolutions | 
 |                               added interactions with ARB_compatibility | 
 |      10   8/02/09  Jon Leech  Reformat to 80 columns and assign ARB | 
 |                               extension number. | 
 |  |