NV_fog_distance
GL_NV_fog_distance
Mark J. Kilgard, NVIDIA Corporation (mjk 'at' nvidia.com)
Copyright NVIDIA Corporation, 1999, 2000, 2001.
NVIDIA Proprietary.
Shipping (version 1.0)
NVIDIA Date: January 18, 2001
$Date$ $Revision$
$Id: //sw/main/docs/OpenGL/specs/GL_NV_fog_distance.txt#14 $
192
Written based on the wording of the OpenGL 1.2 specification.
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.
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
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
None
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.
(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
None
None
| | Last update: November 14, 2006. Cette page doit être lue avec un navigateur récent respectant le standard XHTML 1.1. |