blob: 53006fe3e014186d4e1f6c7760ef2f91f4e5f92f [file] [log] [blame]
XXX - Not complete yet!!!
Name
SGIX_clipmap
Name Strings
GL_SGIX_clipmap
Version
$Date: 1996/06/12 17:19:43 $ $Revision: 1.9 $
Number
33
Dependencies
EXT_texture is required
EXT_texture_object affects the definition of this extension
SGIS_texture_lod affects the definition of this extension
SGI_detail_texture affects the definition of this extension
SGI_sharpen_texture affects the definition of this extension
Overview
Mipmaps provide a general but expensive solution when the texture image
is very large. This extension defines clipmaps, which occupy a small
subset of the memory required by equivalent mipmaps, but provide much
of the mipmap rendering capabilities. Clipmaps are especially useful
for rendering terrain.
Issues
* Is lod clamping treated properly if we have no texel data?
* Should we always have to specify a virtual depth?
New Procedures and Functions
None
New Tokens
Accepted by the <param> parameter of TexParameteri and TexParameterf,
and by the <params> parameter of TexParameteriv and TexParameterfv,
when their <pname> parameter is TEXTURE_MIN_FILTER:
LINEAR_CLIPMAP_LINEAR_SGIX
Accepted by the <pname> parameter of TexParameteri, TexParameterf,
TexParameteriv, TexParameterfv, GetTexParameteriv, and GetTexParameterfv:
TEXTURE_CLIPMAP_FRAME_SGIX
Accepted by the <pname> parameter of TexParameteriv, TexParameterfv,
GetTexParameteriv, and GetTexParameterfv:
TEXTURE_CLIPMAP_CENTER_SGIX
TEXTURE_CLIPMAP_OFFSET_SGIX
TEXTURE_CLIPMAP_VIRTUAL_DEPTH_SGIX
Accepted by the <pname> parameter of GetBooleanv, GetIntegerv,
GetFloatv, and GetDoublev:
MAX_CLIPMAP_DEPTH_SGIX
MAX_CLIPMAP_VIRTUAL_DEPTH_SGIX
Additions to Chapter 2 of the 1.0 Specification (OpenGL Operation)
None
Additions to Chapter 3 of the 1.0 Specification (Rasterization)
GL Specification Table 3.7 is updated as follows:
Name Type Legal Values
---- ---- ------------
TEXTURE_WRAP_S integer CLAMP, REPEAT
TEXTURE_WRAP_T integer CLAMP, REPEAT
TEXTURE_WRAP_R_EXT integer CLAMP, REPEAT
TEXTURE_MIN_FILTER integer NEAREST, LINEAR,
NEAREST_MIPMAP_NEAREST,
NEAREST_MIPMAP_LINEAR,
LINEAR_MIPMAP_NEAREST,
LINEAR_MIPMAP_LINEAR,
FILTER4_SGIS,
LINEAR_CLIPMAP_LINEAR_SGIX
TEXTURE_MAG_FILTER integer NEAREST, LINEAR,
FILTER4_SGIS,
LINEAR_DETAIL_SGIS,
LINEAR_DETAIL_ALPHA_SGIS,
LINEAR_DETAIL_COLOR_SGIS,
LINEAR_SHARPEN_SGIS,
LINEAR_SHARPEN_ALPHA_SGIS,
LINEAR_SHARPEN_COLOR_SGIS
TEXTURE_BORDER_COLOR 4 floats any 4 values in [0,1]
DETAIL_TEXTURE_LEVEL_SGIS integer any non-negative integer
DETAIL_TEXTURE_MODE_SGIS integer ADD, MODULATE
TEXTURE_MIN_LOD_SGIS float any value
TEXTURE_MAX_LOD_SGIS float any value
TEXTURE_BASE_LEVEL_SGIS integer any non-negative integer
TEXTURE_MAX_LEVEL_SGIS integer any non-negative integer
GENERATE_MIPMAP_SGIS boolean TRUE or FALSE
TEXTURE_CLIPMAP_FRAME_SGIX float any non-negative value
TEXTURE_CLIPMAP_CENTER_SGIX 2 integers any 2 non-negative integers
TEXTURE_CLIPMAP_OFFSET_SGIX 2 integers any 2 non-negative integers
TEXTURE_CLIPMAP_VIRTUAL_DEPTH_SGIX 3 integers any 3 non-negative integers
Table 3.7: Texture parameters and their values.
Notes:
* Clipmap filtering is supported only for 2D, borderless textures.
* Clipmap filtering is performed when the texture minification filter
is LINEAR_CLIPMAP_LINEAR_SGIX. We could define other clipmap
filters with NEAREST sampling, but it probably isn't worth the
trouble.
* Clipmap filtering is supported with all magnification filters
except FILTER4_SGIS. Detail and sharpen filtering are performed
only when the texture data are supplied by the level 0 image.
* A clipmap virtualizes a mipmap by holding, at any given time, only a
portion of a full mipmap pyramid. A clipmap is complete only if
levels 0 through B have the same dimension, levels B through N form
the base of a valid mipmap, all image dimensions are a power of 2,
and N is less than MAX_CLIPMAP_DEPTH_SGIX.
Each image level P, where P ranges from B through N, is treated as
though it contains the full image from the same level of the complete
(N+1) level mipmap.
Each image level P, where P ranges from 0 through B-1, is treated as
though it contains a subimage from the same level of the complete
(N+1) level mipmap. This subimage is centered at texel coordinates
S = (Scenter >> P)
T = (Tcenter >> P)
where Scenter and Tcenter are specified by the application.
For instance, if the width of the clipmap is W=8, N=12, and Scenter=
2048, the clipmap will contain the data given by 0's in the S-edge
view below:
0 .********************************00000000********************************.
1 .********************************00000000********************************.
2 .********************************00000000********************************.
3 .********************************00000000********************************.
4 .********************************00000000********************************.
5 .********************************00000000********************************.
6 ****************************00000000****************************
7 ************00000000************
8 ****00000000****
B=9 00000000
10 0000
11 00
N=12 0
Likewise, if Scenter=2016 (32 less than above):
0 .00000000****************************************************************.
1 .****************00000000************************************************.
2 .************************00000000****************************************.
3 .****************************00000000************************************.
4 .******************************00000000**********************************.
5 .*******************************00000000*********************************.
6 ****************************00000000*****************************
7 ************00000000************
8 ****00000000****
9 00000000
10 0000
11 00
N=12 0
* Scenter and Tcenter are specified by the application by calling
TexParameteriv or TexParameterfv with <target> set to TEXTURE_2D,
<pname> set to <TEXTURE_CLIPMAP_CENTER_SGIX>, and <params> pointing
to a vector whose first component is Scenter and whose second
component is Tcenter. The center can be changed at any time.
* The clipped levels (i.e. those levels P, where P<B) of the map can
be framed with a region of texels guaranteed not to be displayed.
The frames allow for paging of new texture data into a non-active
portion of texture memory, enabling efficient roaming throughout the
larger virtual mipmap. The frames for all of the clipped levels are
the same width and are measured as a fraction of the width of the
clipped levels. Specifically,
width of frame in texels = Cframe * W / 2
The floating point value Cframe can take on values from 0.0 to 1.0
and is specified by the application.
Cframe is a non-negative fraction of half the level width specified
by calling TexParameterf or TexParameterfv with <target> set to
TEXTURE_2D, <pname> set to <TEXTURE_CLIPMAP_FRAME_SGIX>, and <param>
set to Cframe or <params> pointing to Cframe. Cframe is clamped to
the range [0,1]. The frame width can be changed at any time.
* During filtering a level of detail is determined just as it would be
for the equivalent (N+1) level mipmap. If the level of detail falls
into the clipped portion of the clipmap and the required texels are
not available within the framed region of the two closest image
levels, the level of detail is increased to the nearest image level
that does include the required texels. The values of TEXTURE_WRAP_S
and TEXTURE_WRAP_T have no effect during clipmap minification.
If SGIS_texture_lod is supported, the level of detail is clamped to
the range defined by TEXTURE_MIN_LOD_SGIS, TEXTURE_MAX_LOD_SGIS,
TEXTURE_BASE_LEVEL_SGIS, and TEXTURE_MAX_LEVEL_SGIS. (Issue: what
if texels do not exist on the level given by max_lod?)
* As the center moves, only texels along the edges of the clipmap levels
change. To allow for incremental loading only of these texels via
TexSubImage2DEXT, torroidal offset values are added to the texture
addresses of each level. For the Pth level where P ranges from 0 to
B-1, these offsets are
Soffsetp = (Soffset >> P)
Toffsetp = (Toffset >> P)
where Soffset and Toffset are specified by the application. Note that
Soffset and Toffset for the top level defines the offsets for
subsequent levels by a simple shift just as with the center.
Soffset and Toffset are specified by calling TexParameteriv or
TexParameterfv with <target> set to TEXTURE_2D, <pname> set to
<TEXTURE_CLIPMAP_OFFSET_SGIX>, and <params> pointing to a vector
whose first component is Soffset and whose second component is
Toffset. The offset can be changed at any time.
* To index into a clipmap of greater than MAX_CLIPMAP_DEPTH_SGIX levels
of detail, additional parameters are provided to restrictively index
a smaller clipmap of (N+1) levels located wholly within a complete,
larger clipmap. The larger clipmap is complete only if levels 0
through B have the same dimension, levels B through V form the base
of a valid mipmap, all image dimensions are a power of 2, and V is
less than MAX_CLIPMAP_VIRTUAL_DEPTH_SGIX. These constraints are
precisely those given above with the exception of the depth, V, being
allowed to range up to MAX_CLIPMAP_VIRTUAL_DEPTH_SGIX.
The second, smaller clipmap has a base level located at level D of
the larger clipmap and has a depth of N. Both parameters D and N are
specified by the application. The smaller clipmap is valid only if D
is between 0 and V, (D+N) is less than or equal to V, and D is less
than MAX_CLIPMAP_DEPTH_SGIX.
Scenter, Tcenter, Soffset, and Toffset are still relative the level
0, the base level of the larger, virtual mipmap, as are the minimum
and maximum levels of detail specified in the SGIS_texture_lod
extension.
For D=2, N=5, V=12, and Scenter=2048, the valid texels are given by
the x's in the diagram below.
0 ...******************************00000000******************************...
1 ...******************************00000000******************************...
D=2 ...******************************xxxxxxxx******************************...
3 ...******************************xxxxxxxx******************************...
4 ...******************************xxxxxxxx******************************...
5 ...******************************00xxxx00******************************...
6 ****************************000xx000****************************
D+N=7 ************000x0000************
8 ****00000000****
9 00000000
10 0000
11 00
V=12 0
Likewise, if Scenter=2016 (32 less than above):
0 .00000000**************************************************************...
1 .****************00000000**********************************************...
D=2 ...**********************xxxxxxxx**************************************...
3 ...**************************xxxxxxxx**********************************...
4 ...****************************xxxxxxxx********************************...
5 ...*****************************00xxxx00*******************************...
6 ****************************000xx000******************************
D+N=7 ************000x0000************
8 ****00000000****
9 00000000
10 0000
11 00
V=12 0
Texel address and level of detail generation proceed with the smaller
clipmap precisely as described above for the original clipmap. If
the level of detail is such that a level below D would be indexed,
texture magnification is performed even though the finer texture
information may be present in texture memory. Likewise, levels of
detail coarser than D+N may demonstrate aliasing. The onus is on the
application to choose parameters D and N to prevent unwanted
filtering operations.
The finest level of the clipmap, D, the depth of the clipmap, N+1, and
the depth of the virtual clipmap, V+1, are specified by calling
TexParameteriv, or TexParameterfv with <target> set to TEXTURE_2D,
<pname> set to <TEXTURE_CLIPMAP_VIRTUAL_DEPTH_SGIX>, and <params> set
to (D,N+1,V+1). These parameters can be changed at any time.
If the depth of the virtual clipmap is zero, clipmap virtualization
is ignored, and texturing proceeds as with a non-virtual clipmap.
* Special Case:
TEXTURE_CLIPMAP_LOD_OFFSET_SGIX is ignored
TEXTURE_CLIPMAP_VIRTUAL_DEPTH_SGIX === TEXTURE_CLIPMAP_DEPTH_SGIX
Additions to Chapter 4 of the 1.0 Specification (Per-Fragment Operations
and the Frame Buffer)
None
Additions to Chapter 5 of the 1.0 Specification (Special Functions)
None
Additions to Chapter 6 of the 1.0 Specification (State and State Requests)
None
Additions to the GLX Specification
None
Dependencies on EXT_texture
EXT_texture is required
Dependencies on EXT_texture_object
If EXT_texture_object is implemented, the state values named
TEXTURE_CLIPMAP_FRAME_SGIX
TEXTURE_CLIPMAP_CENTER_SGIX
TEXTURE_CLIPMAP_OFFSET_SGIX
TEXTURE_CLIPMAP_VIRTUAL_DEPTH_SGIX
are added to the state vector of each texture object. When an attribute
set that includes texture information is popped, the bindings and
enables are first restored to their pushed values, then the bound
textures have their TEXTURE_CLIPMAP_FRAME_SGIX,
TEXTURE_CLIPMAP_CENTER_SGIX, TEXTURE_CLIPMAP_OFFSET_SGIX, and
TEXTURE_CLIPMAP_VIRTUAL_DEPTH_SGIX parameters restored to their pushed
values.
Dependencies on SGIS_texture_lod
If SGIS_texture_lod is not supported, references to user-defined lod
clamping and ranges in this document are invalid and should be ignored.
Dependencies on SGIS_detail_texture
If SGIS_detail_texture is not supported, references to detail texture
mapping in this document are invalid and should be ignored.
Dependencies on SGIS_sharpen_texture
If SGIS_sharpen_texture is not supported, references to sharpen texture
mapping in this document are invalid and should be ignored.
Errors
INVALID_VALUE is generated if TexParameteriv, TexParameterfv,
parameter <pname> is TEXTURE_CLIPMAP_CENTER_SGIX, and either of the two
parameters <params> points to are negative.
INVALID_VALUE is generated if TexParameteriv, TexParameterfv,
parameter <pname> is TEXTURE_CLIPMAP_OFFSET_SGIX, and either of the two
parameters <params> points to are negative.
INVALID_VALUE is generated if TexParameteriv, TexParameterfv,
parameter <pname> is TEXTURE_CLIPMAP_VIRTUAL_DEPTH_SGIX, and any of the
three parameters <params> points to are negative.
INVALID_VALUE is generated if TexParameteriv, TexParameterfv,
parameter <pname> is TEXTURE_CLIPMAP_VIRTUAL_DEPTH_SGIX, and the sum of
the clipmap level of detail offset and the clipmap depth is greater than
the virtual clipmap depth.
New State
Initial
Get Value Get Command Type Value Attrib
--------- ----------- ---- ------- ------
TEXTURE_CLIPMAP_FRAME_SGIX GetTexParameterf Z+ 0 texture
TEXTURE_CLIPMAP_CENTER_SGIX GetTexParameterfv 2 x Z+ 0,0 texture
TEXTURE_CLIPMAP_OFFSET_SGIX GetTexParameterfv 2 x Z+ 0,0 texture
TEXTURE_CLIPMAP_VIRTUAL_DEPTH_SGIX GetTexParameterfv 3 x Z+ 0,0,0 texture
New Implementation Dependent State
Minimum
Get Value Get Command Type Value
--------- ----------- ---- -------
MAX_CLIPMAP_DEPTH_SGIX GetIntegerv Z+ 10
MAX_CLIPMAP_VIRTUAL_DEPTH_SGIX GetIntegerv Z+ 10