| Name |
| |
| NV_fill_rectangle |
| |
| Name Strings |
| |
| GL_NV_fill_rectangle |
| |
| Contact |
| |
| Jeff Bolz, NVIDIA Corporation (jbolz 'at' nvidia.com) |
| |
| Contributors |
| |
| Jeff Bolz, NVIDIA Corporation |
| James Helferty, NVIDIA Corporation |
| |
| Status |
| |
| Shipping |
| |
| Version |
| |
| Last Modified Date: March 27, 2015 |
| Revision: 2 |
| |
| Number |
| |
| OpenGL Extension #466 |
| OpenGL ES Extension #232 |
| |
| Dependencies |
| |
| This extension is written against the OpenGL 4.3 Specification |
| (Compatibility Profile). |
| |
| This extension interacts with OpenGL ES 3.1 (June 4, 2014) |
| |
| If implemented in OpenGL ES, NV_polygon_mode is required. |
| |
| Overview |
| |
| This extension adds a new PolygonMode setting where a triangle is |
| rasterized by computing and filling its axis-aligned screen-space bounding |
| box, disregarding the actual triangle edges. This can be useful for |
| drawing a rectangle without being split into two triangles with an |
| internal edge. It is also useful to minimize the number of primitives |
| that need to be drawn, particularly for a user-interface. |
| |
| New Procedures and Functions |
| |
| None. |
| |
| New Tokens |
| |
| FILL_RECTANGLE_NV 0x933C |
| |
| Additions to Chapter 14 of the OpenGL 4.3 (Compatibility Profile) Specification |
| (Fixed-Function Primitive Assembly and Rasterization) |
| |
| Modify Section 14.6.4 (Options Controlling Polygon Rasterization) |
| |
| The interpretation of polygons for rasterization is controlled using |
| |
| void PolygonMode(enum face, enum mode); |
| |
| <face> is one of FRONT, BACK, or FRONT_AND_BACK, indicating that the |
| rasterizing method described by mode respectively replaces the rasterizing |
| method for front-facing polygons, back-facing polygons, or both front- and |
| back-facing polygons. <mode> is one of the symbolic constants POINT, LINE, |
| FILL, or FILL_RECTANGLE_NV. Calling PolygonMode with POINT causes certain |
| vertices of a polygon to be treated, for rasterization purposes, as if they |
| had been drawn with mode POINTS. The vertices selected for this treatment |
| are those that have been tagged as having a polygon boundary edge beginning |
| on them (see section 10.1.17). LINE causes edges that are tagged as |
| boundary to be rasterized as line segments. (The line stipple counter is |
| reset at the beginning of the first rasterized edge of the polygon, but not |
| for subsequent edges.) FILL is the default mode of polygon rasterization, |
| corresponding to the description in sections 14.6.1, 14.6.2, and 14.6.3. |
| Note that these modes affect only the final rasterization of polygons: in |
| particular, a polygon's vertices are lit, and the polygon is clipped and |
| possibly culled before these modes are applied. |
| |
| FILL_RECTANGLE_NV mode modifies triangle rasterization to consider a sample |
| within the primitive if the sample location is inside the window-aligned |
| bounding box of the triangle after projection. Note that the barycentric |
| weights used in attribute interpolation may be outside the range [0,1] |
| when these primitives are shaded. Special treatment is given to a sample |
| position on the boundary edge of the bounding box. In such a case we |
| require that if two rectangles lie on either side of a common edge (with |
| identical endpoints) on which a sample position lies, then exactly one of |
| the triangles results in the production of the fragment during |
| rasterization. |
| |
| Polygons rendered with FILL_RECTANGLE_NV mode may be clipped by the |
| frustum or by user clip planes, in an implementation-dependent manner. |
| If clipping is applied, the triangle is culled rather than clipped. When |
| quads and polygons are rendered in this mode, they will be tessellated |
| and rasterized as independent triangles (the order of tessellation within |
| a primitive is undefined). |
| |
| Polygon antialiasing applies only to the FILL state of PolygonMode. Polygon |
| antialiasing does not apply to the FILL_RECTANGLE_NV mode. For POINT or |
| LINE, point antialiasing or line segment antialiasing, respectively, apply. |
| |
| An INVALID_OPERATION error is generated by Begin or any Draw command if |
| only one of the front and back polygon mode is FILL_RECTANGLE_NV. |
| |
| |
| New Implementation Dependent State |
| |
| None. |
| |
| New State |
| |
| None. |
| |
| Additions to the AGL/GLX/WGL Specifications |
| |
| None. |
| |
| GLX Protocol |
| |
| None. |
| |
| Modifications to the OpenGL Shading Language Specification, Version 4.30 |
| |
| None. |
| |
| Errors |
| |
| An INVALID_OPERATION error is generated by Begin or any Draw command if |
| only one of the front and back polygon mode is FILL_RECTANGLE_NV. |
| |
| Interactions with OpenGL 4.3 (Core Profile) and OpenGL ES 3.1 |
| |
| If the OpenGL core profile or OpenGL ES is used, references to Begin, line |
| stipple, user clip planes, separate front and back polygon modes, polygon |
| primitives and quad primitives should be removed. |
| |
| Interactions with OpenGL ES 3.1 |
| |
| Using this extension in OpenGL ES 3.1, the tokens from OpenGL should be |
| considered to refer to equivalent tokens from the NV_polygon_mode |
| extension, with an "_NV" suffix: POINT, LINE, FILL, POLYGON_OFFSET_POINT, |
| and POLYGON_OFFSET_LINE. References to PolygonMode should be considered |
| to refer to PolygonModeNV. References to point, line, and polygon |
| antialiasing should be removed. |
| |
| Issues |
| |
| (1) Where in the pipeline does the conversion from triangle to screen- |
| aligned bbox occur? |
| |
| RESOLVED: The new rasterization mode applies during rasterization, not |
| earlier. So transform feedback would write out the triangle as if it were |
| being FILLed normally, and the triangle may have started life as a |
| different type of primitive (e.g. point or line) before being converted to |
| a triangle by a geometry shader. |
| |
| (2) What happens if such a triangle is clipped? |
| |
| RESOLVED: Clipping will cause the triangle to be discarded. |
| |
| (3) How are quads and polygons handled? Are they decomposed into triangles? |
| |
| RESOLVED: When using FILL_RECTANGLE_NV, quads and polygons are decomposed |
| into triangles in an implementation-dependent manner, similar to the |
| behavior used in transform feedback. |
| |
| (4) Do these triangles still have a facingness? |
| |
| RESOLVED: Yes. Face culling is still applied, and the orientation of such |
| a primitive is still observable in the fragment shader (gl_FrontFacing). |
| |
| (5) How is polygon offset applied? |
| |
| RESOLVED: Polygon offset is computed and applied normally to the fill |
| rectangle, using the same techniques used for triangle rasterization. |
| |
| If the Z values for the vertices of the fill primitive are not constant, |
| the slope-dependent portion of the polygon offset will be computed using |
| the three vertices specified. That seems reasonable, since per-pixel Z |
| will be interpolated using the same slopes. |
| |
| However, when using floating-point depth buffers, the meaning of the |
| constant portion of polygon offset will scaled according to the Z values |
| of the three vertices specified for the fill rectangle. Since the |
| interpolated Z values for the fill rectangle may fall outside the range of |
| Z values in the primitive, it's possible that this rescaled constant |
| offset is too small for portions of the fill rectangle where |
| "extrapolated" Z values are larger than any of the Z values of the |
| original triangle. This issue will require a workaround in application |
| code in the unlikely event that it applies. |
| |
| Revision History |
| |
| Revision 2, 2015/03/27 |
| - Add ES interactions |
| |
| Revision 1 |
| - Internal revisions. |