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); 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. 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.