Name
    
    NV_fog_distance

Name Strings

    GL_NV_fog_distance

Contact

    Mark J. Kilgard, NVIDIA Corporation (mjk 'at' nvidia.com)

Notice

    Copyright NVIDIA Corporation, 1999, 2000, 2001.

IP Status

    NVIDIA Proprietary.

Status

    Shipping (version 1.0)

Version

    NVIDIA Date:   January 18, 2001
    Version:       1.0

Number

    192

Dependencies

    Written based on the wording of the OpenGL 1.2 specification.

Overview

    Ideally, the fog distance (used to compute the fog factor as
    described in Section 3.10) should be computed as the per-fragment
    Euclidean distance to the fragment center from the eye.  In practice,
    implementations "may choose to approximate the eye-coordinate
    distance from the eye to each fragment center by abs(ze).  Further,
    [the fog factor] f need not be computed at each fragment, but may
    be computed at each vertex and interpolated as other data are."

    This extension provides the application specific control over how
    OpenGL computes the distance used in computing the fog factor.

    The extension supports three fog distance modes: "eye plane absolute",
    where the fog distance is the absolute planar distance from the eye
    plane (i.e., OpenGL's standard implementation allowance as cited above);
    "eye plane", where the fog distance is the signed planar distance
    from the eye plane; and "eye radial", where the fog distance is
    computed as a Euclidean distance.  In the case of the eye radial
    fog distance mode, the distance may be computed per-vertex and then
    interpolated per-fragment.

    The intent of this extension is to provide applications with better
    control over the tradeoff between performance and fog quality.
    The "eye planar" modes (signed or absolute) are straightforward
    to implement with good performance, but scenes are consistently
    under-fogged at the edges of the field of view.  The "eye radial"
    mode can provide for more accurate fog at the edges of the field of
    view, but this assumes that either the eye radial fog distance is
    computed per-fragment, or if the fog distance is computed per-vertex
    and then interpolated per-fragment, then the scene must be
    sufficiently tessellated.

Issues

    What should the default state be?

      IMPLEMENTATION DEPENDENT.

      The EYE_PLANE_ABSOLUTE_NV mode is the most consistent with the way
      most current OpenGL implementations are implemented without this
      extension, but because this extension provides specific control
      over a capability that core OpenGL is intentionally lax about,
      the default fog distance mode is left implementation dependent.
      We would not want a future OpenGL implementation that supports
      fast EYE_RADIAL_NV fog distance to be stuck using something less.

      Advice:  If an implementation can provide fast per-pixel EYE_RADIAL_NV
      support, then EYE_RADIAL_NV is the ideal default, but if not, then
      EYE_PLANE_ABSOLUTE_NV is the most reasonable default mode.

    How does this extension interact with the EXT_fog_coord extension?

      If FOG_COORDINATE_SOURCE_EXT is set to FOG_COORDINATE_EXT,
      then the fog distance mode is ignored.  However, the fog
      distance mode is used when the FOG_COORDINATE_SOURCE_EXT is
      set to FRAGMENT_DEPTH_EXT.  Essentially, when the EXT_fog_coord
      functionality is enabled, the fog distance is supplied by the
      user-supplied fog-coordinate so no automatic fog distance computation
      is performed.

New Procedures and Functions

    None

New Tokens

    Accepted by the <pname> parameters of Fogf, Fogi, Fogfv, Fogiv,
    GetBooleanv, GetIntegerv, GetFloatv, and GetDoublev:

        FOG_DISTANCE_MODE_NV               0x855A

    When the <pname> parameter of Fogf, Fogi, Foggv, and Fogiv, is
    FOG_DISTANCE_MODE_NV, then the value of <param> or the value pointed
    to by <params> may be:

        EYE_RADIAL_NV                      0x855B
        EYE_PLANE
        EYE_PLANE_ABSOLUTE_NV              0x855C

Additions to Chapter 2 of the 1.2 Specification (OpenGL Operation)

     None

Additions to Chapter 3 of the 1.2 Specification (Rasterization)

 --  Section 3.10 "Fog"
 
    Add to the end of the 3rd paragraph:

    "If pname is FOG_DISTANCE_MODE_NV, then param must be, or params
    must point to an integer that is one of the symbolic constants
    EYE_PLANE_ABSOLUTE_NV, EYE_PLANE, or EYE_RADIAL_NV and this symbolic
    constant determines how the fog distance should be computed."

    Replace the 4th paragraph beginning "An implementation may choose
    to approximate ..." with:

    "When the fog distance mode is EYE_PLANE_ABSOLUTE_NV, the fog
    distance z is approximated by abs(ze) [where ze is the Z component
    of the fragment's eye position].  When the fog distance mode is
    EYE_PLANE, the fog distance z is approximated by ze.  When the
    fog distance mode is EYE_RADIAL_NV, the fog distance z is computed
    as the Euclidean distance from the center of the fragment in eye
    coordinates to the eye position.  Specifically:

      z  =  sqrt( xe*xe + ye*ye + ze*ze );

    In the EYE_RADIAL_NV fog distance mode, the Euclidean distance
    is permitted to be computed per-vertex, and then interpolated
    per-fragment."

    Change the last paragraph to read:

    "The state required for fog consists of a three valued integer to
    select the fog equation, a three valued integer to select the fog
    distance mode, three floating-point values d, e, and s, and RGBA fog
    color and a fog color index, and a single bit to indicate whether
    or not fog is enabled.  In the initial state, fog is disabled,
    FOG_MODE is EXP, FOG_DISTANCE_NV is implementation defined, d =
    1.0, e = 1.0, and s = 0.0; Cf = (0,0,0,0) and if = 0." 

Additions to Chapter 4 of the 1.2 Specification (Per-Fragment Operations
and the Frame Buffer)

    None

Additions to Chapter 5 of the 1.2 Specification (Special Functions)

    None

Additions to Chapter 6 of the 1.2 Specification (State and State Requests)

    None

Additions to the AGL/GLX/WGL Specifications

    None

GLX Protocol

    None

Errors

    INVALID_ENUM is generated when Fog is called with a <pname> of
    FOG_DISTANCE_MODE_NV and the value of <param> or what is pointed
    to by <params> is not one of EYE_PLANE_ABSOLUTE_NV, EYE_PLANE,
    or EYE_RADIAL_NV.

New State

(table 6.8, p198) add the entry:

Get Value              Type    Get Command  Initial Value      Description      Sec     Attribute
--------------------   ----    -----------  ---------------    -----------      -----   ---------
FOG_DISTANCE_MODE_NV   Z3      GetIntegerv  implementation     Determines how   3.10    fog
                                            dependent          fog distance      
                                                               is computed

New Implementation State

    None

Revision History

    None
