| XXX - Not complete yet!!! |
| |
| Name |
| |
| EXT_cull_vertex |
| |
| Name Strings |
| |
| GL_EXT_cull_vertex |
| |
| Version |
| |
| $Date: 1996/11/21 00:52:20 $ $Revision: 1.3 $ |
| |
| Number |
| |
| 98 |
| |
| Dependencies |
| |
| None |
| |
| Overview |
| |
| This extension introduces a method for culling vertexes in object |
| space based on the value of the dot product between the normal at |
| the vertex and a culling eye direction. |
| |
| Culling a polygon by examining its vertexes in object space can be |
| more efficient than screen space polygon culling since the transformation |
| to screen space (which may include a division by w) can be avoided for |
| culled vertexes. Also, vertex culling can be computed before vertexes |
| are assembled into primitives. This is a useful property when drawing |
| meshes with shared vertexes, since a vertex can be culled once, and the |
| resulting state can be used for all primitives which share the vertex. |
| |
| Issues |
| |
| * Should FrontFace affect the comparison of the dot product? |
| It may be useful. For non-local eye positions it is easy for |
| the application to flip the eye direction in order to cull |
| either front or back faces. This doesn't work as well for |
| local eye positions. We'll defer this for now; it is easy |
| to add as an extension later. |
| |
| * Could determine the eye position/direction in object space |
| by transforming the vector (0, 0, 1, 0) by the inverse of |
| the composite of the modelview and projection transformations. |
| Seems better to have the application provide the eye position/direction |
| than to have OpenGL pick one arbitrarily. |
| |
| New Procedures and Functions |
| |
| void CullParameterfvEXT (enum pname, float *params) |
| void CullParameterdvEXT (enum pname, double *params) |
| |
| New Tokens |
| |
| Accepted by the <cap> parameter of Enable, Disable, and |
| IsEnabled, and by the <pname> parameter of GetBooleanv, |
| GetIntegerv, GetFloatv, and GetDoublev: |
| |
| CULL_VERTEX_EXT 0x81AA |
| |
| Accepted by the <pname> parameter of CullParameterfvEXT, |
| CullParameterdvEXT, GetBooleanv, GetIntegerv, GetFloatv, and |
| GetDoublev: |
| |
| CULL_VERTEX_EYE_POSITION_EXT 0x81AB |
| CULL_VERTEX_OBJECT_POSITION_EXT 0x81AC |
| |
| Additions to Chapter 2 of the 1.1 Specification (OpenGL Operation) |
| |
| Before the discussion of Clipping, add a description of |
| vertex culling. |
| |
| Vertex Culling |
| |
| Vertex culling may be used to eliminate vertexes which are |
| part of back facing primitives. Vertex culling is enabled |
| or disabled by using the Enable or Disable commands with |
| the symbolic constant CULL_VERTEX_EXT. |
| |
| When vertex culling is enabled, vertexes are classified as |
| front or back facing according to the sign of the dot |
| product between the normal at the vertex and an eye direction |
| vector from the vertex toward the eye position. When |
| (normal dot eye_direction) <= 0 the vertex is classified as |
| back facing. When (normal dot eye_direction) > 0 the vertex |
| is classified as front facing. Vertexes are culled when the |
| face orientation determined by the dot product is the same |
| as the face specified by CullFace. When all of the vertexes |
| of a polygon are culled, then the polygon is culled. |
| |
| The eye direction used for vertex culling is determined |
| by the culling eye position. The culling eye position |
| is homogeneous (like a light position). When the w component |
| of the position is non-zero, the position is local and the |
| eye direction at each vertex is computed by subtracting |
| the vertex position from the eye position. When the w |
| component of the position is zero, the position is non-local |
| and the is used as the eye direction for all vertexes. |
| |
| The culling eye position is specified by the CullParameter |
| command. Positions specified when <pname> is |
| CULL_VERTEX_EYE_POSITION_EXT are in eye space and are |
| transformed by the inverse of the current MODELVIEW |
| transformation. Positions specified when <pname> is |
| CULL_VERTEX_OBJECT_POSITION_EXT are in object space and are |
| used directly. |
| |
| Vertex culling is performed independently of face culling. |
| Polygons on the silhouettes of objects may have both front |
| and back facing vertexes. Since polygons are culled only |
| when all of their vertexes are culled, face culling may have |
| to be used in addition to vertex culling in order to correctly |
| cull silhouette polygons. |
| |
| Additions to Chapter 3 of the 1.1 Specification (Rasterization) |
| |
| None |
| |
| Additions to Chapter 4 of the 1.1 Specification (Per-Fragment Operations |
| and the Frame Buffer) |
| |
| None |
| |
| Additions to Chapter 5 of the 1.1 Specification (Special Functions) |
| |
| None |
| |
| Additions to Chapter 6 of the 1.1 Specification (State and State Requests) |
| |
| None |
| |
| Additions to the GLX Specification |
| |
| XXX - Not complete yet!!! |
| |
| GLX Protocol |
| |
| XXX - Not complete yet!!! |
| |
| Errors |
| |
| INVALID_ENUM if <pname> parameter to CullParameterfvEXT or |
| CullParameterdvEXT is not CULL_VERTEX_EYE_POSITION_EXT, or |
| CULL_VERTEX_OBJECT_POSITION_EXT. |
| |
| INVALID_OPERATION if CullParameterfvEXT or CullParameterdvEXT called |
| between execution of Begin and the corresponding execution of End. |
| |
| New State |
| |
| Initial |
| Get Value Get Command Type Value Attrib |
| --------- ----------- ---- ------- ------ |
| |
| CULL_VERTEX_EXT IsEnabled B False transform/enable |
| CULL_VERTEX_OBJECT_POSITION_EXT GetFloatv P (0,0,1,0) transform |
| CULL_VERTEX_EYE_POSITION_EXT GetFloatv P (0,0,1,0) transform |
| |
| New Implementation Dependent State |
| |
| None |