Name
SGIX_subdiv_patch
Name Strings
GL_SGIX_subdiv_patch
Version:
$Date: 1999/12/28 01:40:36 $ $Revision: 1.4 $
Number
XXX
Dependencies
None
Overview:
This extension provides support for rendering subdivision surfaces.
Subdivision surfaces are defined as a repeated refinement of an
initial control mesh. The direct and simple representation of a surface
is attractive for rendering, where trimming bottlenecks can be avoided.
The key strengths of subdivision surfaces are:
- Ability to render arbitrary meshes.
- Geometry compression, which is evident by the virtue of refinement.
- Continuous LOD control, that relieves the application from keeping
multiple geometry definitions, per-frame.
Triangular mesh representation is more convenient for rendering and is
considered first. Other representations as well as non-triangular ones
can be considered in a separate extension.
The API is mainly concerned with a geometrical primitive extracted from
the base mesh. The primitive is a topological definition for a triangle
pair and all its neighboring vertices. In addition, vertices and
edges may be tagged for representing sharp features. This primitive
is called the 'subdivision patch..
Issues:
* We can reduce tokens for defining sharp vertices and have the
implementation detect most of the tags. Is that the right trade off?
* Is a per-corner maximum valence criteria preferred? (compared to
accumulative criteria)
* How do we fare against the recently presented surface simplification?
* View dependency is simple per-object but complex for partials.
* There seems to be a de-facto standard evolving in the industry
which uses quadrilaterals as the base primitive. Currently, we are
providing Loop's technique. The API (for the most part) remains
the same. Shall we expose both techniques?
TODO:
* fragment light space dependencies (e.g. tangent and binorm).
New Procedures and Functions:
void glSubdivPatchSGIX(const void **vertexData,
const void **vertexTag,
const void **edgeTag);
void glSubdivPatchParameterfSGIX(GLenum pname, GLfloat param);
void glSubdivPatchParameteriSGIX(GLenum pname, GLint param);
New Tokens:
Accepted by vertexTag:
GL_SUBDIVPATCH_SMOOTH_SGIX
GL_SUBDIVPATCH_DART_BIT_SGIX
GL_SUBDIVPATCH_CREASE_REGULAR_BIT_SGIX
GL_SUBDIVPATCH_CREASE_IRREGULAR_BIT_SGIX
GL_SUBDIVPATCH_CORNER_BIT_SGIX
GL_SUBDIVPATCH_CONICAL_BIT_SGIX
Accepted by edgeTag:
GL_SUBDIVPATCH_SMOOTH_SGIX
GL_SUBDIV_PATCH_SHARP_BIT_SGIX
Accepted by the parameter of glSubdivPatchParameteriSGIX or
glSubdivPatchParameterfSGIX are:
GL_SUBDIVPATCH_LEVEL_SGIX
GL_SUBDIVPATCH_FORMAT_SGIX
Accepted by the parameter GL_SUBDIVPATCH_FORMAT_SGIX of
glSubdivPatchParameteriSGIX or glSubdivPatchParameterfSGIX are:
GL_V3F
GL_C3F_V3F
GL_T2F_V3F
GL_T2F_C3F_V3F
Accepted by the pname parameter of GetBooleanv, GetIntegerv,
GetFloatv, and GetDoublev:
GL_SUBDIVPATCH_LEVEL_SGIX
GL_SUBDIVPATCH_FORMAT_SGIX
GL_SUBDIVPATCH_VALENCE_MAX
Additions to Chapter 2 of the 1.0 Specification (OpenGL Operation):
None
Additions to Chapter 3 of the 1.0 Specification (Rasterization):
None
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):
5.7 Subdivision Surfaces
[This part to be filled out with operation details.]
Additions to Chapter 6 of the 1.0 Specification (State and State Requests):
None
Additions to the GLX Specification:
None
Dependencies on SGI_extension_name:
None
Errors:
INVALID_ENUM is generated if the parameter is
not GL_SUBDIVPATCH_LEVEL_SGIX or GL_SUBDIVPATCH_FORMAT_SGIX.
INVALID_ENUM is generated if the parameter is not
one of GL_V3F, GL_C4UB_V3F, GL_T2F_V3F, or GL_T2F_C4UB_V3F, when the
parameter is GL_SUBDIVPATCH_FORMAT_SGIX.
INVALID_OPERATION is generated if any of the valence counts exceeds
GL_SUBDIVPATCH_VALENCE_MAX_SGIX.
New State:
Get Value Get Command Type Initial Value
--------- ----------- ---- ------------
GL_SUBDIVPATCH_LEVEL_SGIX GetFloatv F 3
GL_SUBDIVPATCH_FORMAT_SGIX GetIntegerv I GL_V3F
New Implementation Dependent State
None