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