SlideShare a Scribd company logo
1 of 7
Download to read offline
Programming with NV path rendering:
                An Annex to the SIGGRAPH paper GPU-accelerated Path Rendering
                                                              Mark J. Kilgard
                                                            NVIDIA Corporation∗


Abstract                                                                    For example, PostScript [Adobe Systems 1985] provides three
                                                                            commands (arc, arcn, and arct) for specifying circular arc
This annex provides a practical overview of the OpenGL-based pro-           segments. While standards developed after PostScript sought to
gramming interface described in our SIGGRAPH Asia 2012 paper                generalize circular arc segments to an elliptical form, our inter-
GPU-accelerated Path Rendering.                                             face supports circular arc commands to match PostScript’s param-
                                                                            eterization. So rather than require an application to convert such
                                                                            PostScript circular paths into some alternate form, the circular arc
Keywords: NV path rendering, path rendering, vector graphics,
                                                                            commands are handled with semantics exactly matching PostScript.
OpenGL, stencil buffer
                                                                            Likewise, OpenVG [Khronos Group 2008] has a four elliptical arc
                                                                            segment commands, each expecting five coordinate values; whereas
1 Introduction                                                              SVG has a single elliptical arc segment command with five contin-
                                                                            uous coordinate values and two Boolean coordinates.
Our SIGGRAPH Asia paper GPU-accelerated Path Rendering                      For line segments, the general line segment command takes an
[Kilgard and Bolz 2012] describes a system for accelerating vec-            (x, y) control point—but horizontal and vertical line segments take
tor graphics on GPUs. NVIDIA has implemented the system                     a single horizontal or vertical coordinate respectively.
and has been shipping the functionality for its GeForce and
Quadro GPUs since the summer of 2011. We refer the reader to                For B´ zier curve segments, commands exist for smooth B´ zier seg-
                                                                                 e                                                 e
that paper for the motivation and technical underpinning of the             ments, matching up with the prior command’s segment to provide
NV path rendering [Kilgard 2012] OpenGL extension. In par-                  C1 continuity.
ticular, that paper explains our “Stencil, then Cover” (StC) approach
to filling and stenciling paths.                                             Where appropriate, we provide relative and absolute versions of all
                                                                            path commands. With relative commands, path coordinates indicat-
In this annex to the forementioned paper we explain the pro-                ing a position are relative to the end point of the prior path segment.
gramming interface in more detail. The intended audience for
this annex is developers evaluating and learning to program                 In addition to eliminating the semantic gap between other path stan-
NV path rendering. You should be familiar with the OpenGL                   dards and our interface, we note that paths can be represented with
[Segal and Akeley 2012] programming interface. Familiarity with             fewer path coordinates when the variety of available path com-
path rendering standards such as PostScript or SVG is helpful.              mands is broad. Also, editing of the sequence of path commands
                                                                            and coordinates is straightforward when each standard’s path com-
Figure 1 shows how our new path pipeline co-exists with the ex-             mand vocabulary is supported directly. Table 1 organizes the sup-
isting pipelines in OpenGL for pixel and vertex processing. Your            ported path commands.
application can mix traditional OpenGL usage with path rendering.
                                                                            Path objects are specified in four ways:
2     Path Object Specification                                                1. Explicitly, from a sequence of path commands and their cor-
                                                                                 responding path coordinates.
Before an application can render paths, it must create a path ob-
ject corresponding to each path. A path object is a container for             2. From a string conforming to a standard grammar for specify-
the sequence of path commands and corresponding coordinates                      ing a paths. Both PostScript and SVG have standard gram-
for the path. Additionally, each path object maintains per-object                mars for paths—and we support both.
parameters (see Section 3) and the “baked” GPU-resident state                 3. From a Unicode character point of an outline font. A font can
needed to stencil and cover the path object. Like other types of                 be specified with a system name (such as Helvetica or Arial),
objects in OpenGL, path objects are named by 32-bit unsigned in-                 an outline font filename, or a built-in font.
tegers. Names of path objects can be generated, tested for existence,
and deleted respectively with glGenPathsNV, glIsPathNV,                       4. Derived from one or more existing path objects. The new
and glDeletePathsNV commands—matching the mechanism                              path may be the result of an arbitrary projective transform of
OpenGL uses for texture, buffer, and display list objects.                       an existing path, or the linear weighting of exiting paths with
                                                                                 matching command sequences.
2.1 Path Segment Commands
                                                                            2.2 Explicit Path Specification
The path commands supported by NV path rendering are the
union of path commands from all major path rendering standards.             The command
We designed NV path rendering to be a low-level interface
upon which all major path rendering standards can be hosted. Elim-            void glPathCommandsNV(GLuint path,
                                                                                                    GLsizei numCmds,
inating any semantic friction between the path commands of vari-
                                                                                                    const GLubyte *cmds,
ous standards and our interface is important to us.                                                 GLsizei numCoords,
                                                                                                    GLenum coordType,
    ∗ e-mail:   mjk@nvidia.com                                                                      const void *coords);




                                                                        1
Relative       Number of scalar   Character
                           Path command                         version          coordinates        alias      Origin
                           GL   MOVE TO NV                                            2             M/m          all
                           GL   LINE TO NV                                            2             L/l          all
                           GL   HORIZONTAL LINE NV                                    1             H/h         SVG
                           GL   VERTICAL LINE NV                                      1             V/v         SVG
                           GL   QUADRATIC CURVE TO NV                                 4             Q/q         SVG
                           GL   CUBIC CURVE TO NV                                     6             C/c          all
                           GL   SMOOTH QUADRATIC CURVE TO NV                          2             T/t         SVG
                           GL   SMOOTH CUBIC CURVE TO NV                              4             S/s         SVG
                           GL   SMALL CCW ARC TO NV                                   5              -        OpenVG
                           GL   SMALL CW ARC TO NV                                    5              -        OpenVG
                           GL   LARGE CCW ARC TO NV                                   5              -        OpenVG
                           GL   LARGE CW ARC TO NV                                    5              -        OpenVG
                           GL   ARC TO NV                                             7             A/a         SVG
                           GL   CIRCULAR CCW ARC TO NV                               5              -        PostScript
                           GL   CIRCULAR CW ARC TO NV                                5              -        PostScript
                           GL   CIRCULAR TANGENT ARC TO NV                           5              -        PostScript
                           GL   RECT NV                                              4              -          PDF
                           GL   DUP FIRST CUBIC CURVE TO NV                          4              -          PDF
                           GL   DUP LAST CUBIC CURVE TO NV                           4              -          PDF
                           GL   RESTART PATH NV                                      0              -        PostScript
                           GL   CLOSE PATH NV                                        0              -           all

Table 1: Path commands supported by NV path rendering. The character alias column provides an ASCII alias for the absolute/relative
version of token. The “all” for origin means the path command is common to all path rendering standards.


                                                                              The following code fragment creates path object 42 containing the
                                                                              contours of a five-point star and heart:
                                                                                static const GLubyte pathCommands[10] =
                                                                                  { GL_MOVE_TO_NV, GL_LINE_TO_NV,
                                                                                    GL_LINE_TO_NV, GL_LINE_TO_NV,
                                                                                    GL_LINE_TO_NV, GL_CLOSE_PATH_NV,
                                                                                    ’M’, ’C’, ’C’, ’Z’ }; // character aliases
                                                                                static const GLshort pathCoords[12][2] =
                                                                                  { {100,180}, {40,10}, {190,120}, {10,120}, {160,10},
                                                                                    {300,300}, {100,400}, {100,200}, {300,100},
                                                                                    {500,200}, {500,400}, {300,300} };
                                                                                GLuint pathObj = 42;
                                                                                glPathCommandsNV(pathObj, 10, pathCommands,
                                                                                  24, GL_SHORT, pathCoords);


                                                                              The example demonstrates how tokens or character aliases can be
                                                                              used interchangeably to specify a path.

                                                                              2.3 Grammars for Path Specification
Figure 1: High-level data flow of OpenGL showing pixel, vertex,
and new path pipelines.                                                       The command
                                                                                glPathStringNV(GLuint path, GLenum format,
                                                                                               GLsizei length, const void *pathString);

specifies a new path object named path where numCmds indi-
cates the number of path commands, read from the array com-                   specifies a new path object named path where format must be
mands, with which to initialize that path’s command sequence.                 either GL PATH FORMAT SVG NV or GL PATH FORMAT PS NV,
These path commands reference coordinates read sequentially from              in which case the length and pathString are interpreted respec-
the coords array. The type of the coordinates read from the                   tively according to SVG’s grammar1 for paths or PostScript’s sub-
coords array is determined by the coordType parameter which                   grammar for user paths. This code fragment is functionally identi-
must be one of GL BYTE, GL UNSIGNED BYTE, GL SHORT,                           cal to the prior explicit path specification example but uses an SVG
GL UNSIGNED SHORT, or GL FLOAT. Coordinates supplied in                       path string:
more compact data types allows paths to be stored more efficiently.              const char *svgPathString =
                                                                                  // star
                                                                                  M100,180 L40,10 L190,120 L10,120 L160,10 z
The numCmds elements of the cmds array must be tokens (or char-                   // heart
acter aliases) from Table 1. The command sequence matches the el-                 M300 300 
ement order of the cmds array. Each command references a number
of coordinates specified by the “Number of scalar coordinates” col-              1 The Backus-Naur Form (BNF) description of the SVG path gram-
umn of Table 1, starting with the first (zero) element of the coords           mar is found here http://www.w3.org/TR/SVG/paths.html#
array and advancing by the coordinate count for each command.                 PathDataBNF



                                                                          2
C100 400,100 200,300 100,500 200,500 400,300 300Z;                       GLuint pathTemplate = ˜0; // Biggest path name
  glPathStringNV(pathObj, GL_PATH_FORMAT_SVG_NV,                               glPathCommandsNV(pathTemplate,
    (GLsizei)strlen(svgPathString), svgPathString);                               0, NULL, 0, GL_FLOAT, NULL);
                                                                               glPathParameterfNV(pathTemplate,
                                                                                  GL_PATH_STROKE_WIDTH_NV, emScale*0.1f);
Creating paths from strings has proven very convenient and avoids
                                                                               glPathParameteriNV(pathTemplate,
having each application re-implement standard path grammar                        GL_PATH_JOIN_STYLE_NV, GL_MITER_TRUNCATE_NV);
parsers.                                                                       glPathParameterfNV(pathTemplate,
                                                                                  GL_PATH_MITER_LIMIT_NV, 1.0);
2.4 Specifying Paths from Glyphs of a Font                                     // Create path object range for Latin-1 character codes
                                                                               GLuint glyphBase = glGenPathsNV(numChars);
Text rendering is a first-class feature in every major path render-             // Typeface names in priority order
                                                                               struct {
ing API and standard. Requiring applications to load outlines of
                                                                                  GLenum fontTarget;
glyphs is just too common, not to mention arduous and platform-                   const char *name;
dependent, so NV path rendering provides a mechanism for                       } font[] = {
applications to create path objects from glyphs—including contigu-                { GL_SYSTEM_FONT_NAME_NV,    Liberation Sans },
ous ranges of glyphs indexed by their Unicode character point.                    { GL_SYSTEM_FONT_NAME_NV,    Verdana },
                                                                                  { GL_SYSTEM_FONT_NAME_NV,    Arial },
Two        commands          glPathGlyphRangeNV               and                 // Final standard font provides guaranteed supported
glPathGlyphsNV create a sequence of path objects given                            { GL_STANDARD_FONT_NAME_NV, Sans }
a font and a range or sequence of Unicode character points for the             };
font. The font can be specified using a system font name (such                  const int numFonts = sizeof(font)/sizeof(font[0]);
as “Arial” or “Helvetica” with a file name for a file in a standard              for (int i=0; i numFonts; i++) { // For each font
font file format such as TrueType, or a built-in font name (such                   glPathGlyphRangeNV(glyphBase,
as “Sans,” “Serif,” or “Mono”) that is guaranteed to be available                   font[i].fontTarget, font[i].name, GL_BOLD_BIT_NV,
                                                                                    0, numChars, GL_USE_MISSING_GLYPH_NV,
on every NV path rendering implementation, regardless of
                                                                                    pathTemplate, emScale);
platform.                                                                      }
Once these path objects are populated, these glyph path objects can
be stenciled and covered, whether filled or stroked, just like any            Path objects loaded from glyphs also have associated glyph and
other path object.                                                           font metrics loaded corresponding to their character point. These
                                                                             metrics and spacing information are discussed in Section 5.
The glPathGlyphRangeNV and glPathGlyphsNV com-
mands will only create a path object for a given path name if that
                                                                             2.5 Copied, Weighted, and Transformed Paths
path object name does not already correspond to an existing path
object. This behavior is designed to populate path object ranges
                                                                             Additional commands for specifying path objects work by generat-
with glyph outlines consistent with the font-family property
                                                                             ing a new path object from one or more existing path objects. The
of CSS 2.1 [CSS Working Group 2011]. An application can load a
                                                                             glCopyPathNV command is the simplest and simply copies the
sequence of fonts for a given range of path objects repeatedly know-
                                                                             state of a named existing path object to another path object name.
ing this will resolve to some supported set of font glyphs eventually.
                                                                             Path parameters and glyph metrics are copied by glCopyPathNV.
The glPathGlyphRangeNV command has the following proto-
                                                                             The glInterpolatePathsNV command takes two (source)
type:
                                                                             path object names and a weighting factor and creates a
  void glPathGlyphRangeNV(GLuint firstPathName,                              new (destination) path object that is the linear interpo-
                          GLenum fontTarget,                                 lation based on the weighting factor of the two source
                          GLconst void *fontName,                            paths.     The glWeightPathsNV command generalizes the
                          GLbitfield fontStyle,                              glInterpolatePathsNV to linear combination of a specified
                          GLuint firstGlyph,
                                                                             number of source path objects and corresponding weighting fac-
                          GLsizei numGlyphs,
                          GLenum handleMissingGlyphs,
                                                                             tors. All the path objects involved in interpolating or weighting
                          GLuint pathParameterTemplate,                      must have identical path command sequences and contain no circu-
                          GLfloat emScale);                                  lar or elliptical arc segment commands. The destination path ob-
                                                                             ject’s parameters are copied from the first destination path object;
The emScale parameter allows fonts of different formats to be                glyph metrics are all set invalid (to -1).
loaded with a consistent number of path units per em (a typographic          The glTransformPathNV command take a source path object
measure of glyph scale). Path coordinates and glyph metrics are              name and generates a new named destination path object corre-
scaled to match the specified emScale. To ensure all path objects in          sponding to the destination path object transformed by an affine lin-
a range of glyphs have a consistent set of path parameters, the path-        ear transform. Path commands such as horizontal or vertical lines
ParameterTemplate path object names a path object from which the             or circular arcs may be promoted to a more general path command
new glyph path objects should copy their parameters.                         form as required to perform the transformation. Relative commands
This example shows how a range of path objects for sans serif fonts          are converted to absolute commands, transformed, and then con-
for the Latin-1 character range can be populated:                            verted back to relative commands.

  // Constants                                                               If the destination path object name refers to an existing path object,
  const GLint numChars = 256;   //        ISO/IEC 8859-1                     that path object is replaced (implicitly deleting the old object) with
                                //        8-bit range                        the new path object. The destination name may be one of the source
  const GLfloat emScale = 2048; //        TrueType path                      names.
                                //        units per em
                                                                             Assuming the implementation performs a lazy copy of path
  // Create empty path object for use as parameter template                  commands and coordinates, glCopyPathNV allows effi-



                                                                         3
cient rendering of a path with different stroking parameters.
glInterpolatePathsNV can help implement Flash’s Shape
Morph functionality and OpenVG’s vgInterpolatePath
command.       glTransformPathNV can help implement
SVG 1.2’s non-scaling stroke functionality and OpenVG’s
vgTransformPath.

3 Path Parameters
Every path object has state in addition to its sequence of path com-
mands and coordinates.

3.1 Settable Parameters                                                                              Figure 2: Glyph metrics.

The     glPathParameteriNV,             glPathParameterfNV,
glPathParameterivNV, and glPathParameterfvNV                                and glGetPathParameterfvNV, the dashing array with
commands respectively set path parameters of a specified path                glGetPathDashArrayNV, the path command array with
object given integer or float data supplied by a scalar parameter or         glGetPathCommandsNV, and path coordinate array with
vector array.                                                               glGetPathCoordsNV. Additionally, computed parameters for
                                                                            each path object can be queried; see Table 3.
Table 2 summarizes the settable parameters. Many parameters deal
with embellishments to stroking such as the stroke width, join style,
miter limit, end caps, and dash caps.                                                    Name                                   Type
                                                                                         GL   PATH   COMMAND COUNT NV           N
                                                                                         GL   PATH   COORD COUNT NV             N
 Name                                Type       Initial value
                                                                                         GL   PATH   COMPUTED LENGTH NV          +
 GL   PATH   STROKE WIDTH NV           +        1.0                                      GL   PATH   OBJECT BOUNDING BOX NV     4×
 GL   PATH   JOIN STYLE NV           4-valued   GL MITER REVERT NV                       GL   PATH   FILL BOUNDING BOX NV       4×
 GL   PATH   MITER LIMIT NV            +        4                                        GL   PATH   STROKE BOUNDING BOX NV     4×
 GL   PATH   INITIAL END CAP NV      4-valued   GL FLAT
 GL   PATH   TERMINAL END CAP NV     4-valued   GL FLAT
                                                                                       Table 3: Computed path object parameters.
 GL   PATH   INITIAL DASH CAP NV     4-valued   GL FLAT
 GL   PATH   TERMINAL DASH CAP NV    4-valued   GL FLAT
 GL   PATH   DASH OFFSET NV                     0.0
 GL   PATH   DASH OFFSET RESET NV    2-valued   GL MOVE TO CONTINUES NV
                                                                            3.4 Glyph and Font Metrics
 GL   PATH   CLIENT LENGTH NV          +        0.0
 GL   PATH   FILL MODE NV            4-valued   GL COUNT UP NV
 GL   PATH   FILL MASK NV            mask       all 1’s                     Path objects created from character points from a font are tagged
 GL   PATH   FILL COVER MODE NV      3-valued   GL CONVEX HULL NV           with additional read-only glyph metrics. These metrics are use-
 GL   PATH   STROKE COVER MODE NV    3-valued   GL CONVEX HULL NV           ful for text layout. Additionally, every glyph has aggregate per-font
 GL   PATH   STROKE MASK NV          mask       all 1’s                     metrics for its corresponding font. The metrics are obtained directly
                                                                            from the font except for any scaling based on the emScale. The
               Table 2: Settable path object parameters.                    glGetPathMetricRangeNV and glGetPathMetricsNV
                                                                            queries return the glyph and per-font metrics for a range or se-
                                                                            quence of path objects respectively.
3.2 Dashing State                                                           As shown in Figure 2, the glyph metrics provide each glyph’s width
                                                                            and height and (x, y) bearing and advance for both horizontal and
Dashing is an embellishment to stroking where a repeated pattern            vertical layout. These metrics are expressed in path space units.
of enabled stroking and gaps in stroking is applied during stroking.
The conventional glPathParameteriNV, etc. commands are                      Additional per-font metrics can be queried from any glyph belong-
ill-suited to setting a variable number of dash offsets.                    ing to a particular font. These metrics include a bounding box large
                                                                            enough to contain any glyph in the font, the native number of font
Instead parameters to control the dash pattern of a stroked path are        units per em, the font-wide ascender, descender, and height dis-
specified by the command                                                     tances, maximum advance for horizontal and vertical layout, un-
                                                                            derline position and thickness.
  void glPathDashArrayNV(GLuint path,
                         GLsizei dashCount,                                 Requested metrics are specified in a bitmask and returned to an
                         const GLfloat *dashArray);                         application-provided array of floats.

where path is the name of an existing path object. A dashCount
of zero indicates the path object is not dashed; in this case, the
                                                                            4 Rendering Paths via Stencil, then Cover
dashArray is not accessed. Otherwise, dashCount provides a count
of how many float values to read from the dashArray array.                   Once a path object is created, it can be rendered with the “stencil,
                                                                            then cover” approach.
3.3 Computed Parameters and Querying State                                  The mapping from path space to clip space and ultimately win-
                                                                            dow space is determined by OpenGL’s standard modelview, pro-
All settable path object state is able to be queried; this in-              jection, viewport, and depth range transforms. An OpenGL pro-
cludes settable parameters with glGetPathParameterivNV                      grammer familiar with OpenGL’s glMatrixMode, glRotatef,



                                                                        4
glTranslatef, etc. matrix commands for transforming 3D ge-
ometry uses the same commands to manipulate the transformations
of path objects.
For example, the code below establishes an orthographic path-to-
clip-space to map the [0..500] × [0..400] region used by the star-
and-heart path:
  glMatrixLoadIdentityEXT(GL_PROJECTION);
  glMatrixLoadIdentityEXT(GL_MODELVIEW);
  glMatrixOrthoEXT(GL_MODELVIEW, 0, 500, 0, 400, -1, 1);


This code demonstrates OpenGL’s selector-free matrix manipula-
tion commands introduced by the EXT direct state access
(DSA) extension [Kilgard 2009].

4.1 Path Rendering in Two Steps

Now we can render the filled and stroked star-and-heart path. We
assume the stencil buffer has been initially cleared to zero.

Stencil Step for Filling   First we stencil the filled region                          Figure 3: Filled and stroked path rendering result.
of the star-and-heart path into the stencil buffer with the
glStencilFillPathNV command:
  glStencilFillPathNV(pathObj, GL_COUNT_UP_NV, 0x1F);                         This computes the point containment of every sample in the frame-
                                                                              buffer w.r.t. the stroked path—and if the sample is contained in the
The winding number of each sample in the framebuffer w.r.t. the               path’s stroke, the sample’s stencil value is set to 0x1 with a write
transformed path is added (GL COUNT UP) to the stencil value cor-             mask of bit-inverted zero (writing all stencil bits).
responding to each rasterized same. The 0x1F mask indicates that
only the five least significant stencil bits are modified—effectively            Cover Step for Stroking       Second we conservatively cover the
resulting in modulo-32 addition. More typically, this mask will be            previously stenciled stroked region of the star-and heart path. We
0xFF.                                                                         leave stencil as configured previously—non-zero values will in-
                                                                              clude the 0x1 value written by the glStencilStrokePathNV
Instead of GL COUNT UP, we could also subtract
                                                                              command, but we change the color to yellow:
(GL COUNT DOWN) or invert bits (GL INVERT) by a count
equal to each sample’s winding number w.r.t. the transformed path.              glColor3f(1,1,0); // yellow
                                                                                glCoverStrokePathNV(pathObj, CONVEX_HULL);
Cover Step for Filling     Second we conservatively cover the previ-
ously stenciled filled region of the star-and heart path. The shading,         The complete rendering result is shown in Figure 3.
stencil testing, and blending are fully controlled by the application’s
OpenGL context state during the cover. So we first enable stencil              4.2 Accessible Samples
testing to discard color samples with a stencil value of zero (those
not in the path as determined by the prior stencil step); for samples
that survive the stencil test, we want to reset the stencil value to          The fill and stroke stencil/cover commands conceptually operate
zero and shade the corresponding sample’s color value green. So:              on all samples in the framebuffer. Potentially every sample in the
                                                                              framebuffer could be updated by these commands. However, the set
  glEnable(GL_STENCIL_TEST);                                                  of accessible samples be restricted the by current OpenGL context
  glStencilFunc(GL_NOTEQUAL, 0, 0x1F);                                        state.
  glStencilOp(GL_KEEP, GL_KEEP, GL_ZERO);
  glColor3f(0,1,0); // green                                                  Clip planes, polygon stipple, window ownership, scissoring, stencil
  glCoverFillPathNV(pathObj, GL_BOUNDING_BOX_NV);                             testing (on write masked stencil bits during stencil fill/stroke op-
                                                                              erations), depth testing, depth bounds testing, and the multisample
The result is a green star to the left of a green heart.                      mask all limit, when enabled, the accessible samples.
                                                                              The cover fill/stroke commands further limit the updated samples
Stencil Step for Stroking      Stroking proceeds similarly in two             to the bounding box or convex hull (depending on the cover mode).
steps; however before rendering, we configure the path object with
desirable path parameters for stroking. Specify a wider 6.5-unit
stroke and the round join style:                                              4.3 Path Coordinate Generation
  glPathParameteriNV(pathObj,                                                 Paths do not have per-vertex attributes such as colors and texture co-
    GL_PATH_JOIN_STYLE_NV, GL_ROUND_NV);
                                                                              ordinates that are interpolated over geometric primitives as 3D ge-
  glPathParameterfNV(pathObj,
    GL_PATH_STROKE_WIDTH_NV, 6.5);
                                                                              ometry does. Instead varying attributes used by the fragment shader
                                                                              must be generated as a linear function of the path-space coordi-
                                                                              nate system. The glPathColorGenNV, glPathTexGenNV,
Now we first stencil the stroked coverage for the heart-and-star path
                                                                              and glPathFogGenNV command generated color, texture coor-
into the stencil buffer:
                                                                              dinate sets, and the fog coordinate respectively; the loosely mimic
  glStencilStrokePathNV(pathObj, 0x1, ˜0);                                    OpenGL’s fixed-function glTexGenfvNV, etc. commands.



                                                                          5
To match a common idiom in path rendering standards, the path co-             and glIsPointInStrokePathNV provide efficient determi-
ordinate generation supports mapping a path’s path space bounding             nations of whether an (x, y) point in a path’s local coordinate
box to a normalized [0..1] × [0..1] square.                                   system is inside or outside the fill or stroke of the path. The
                                                                              query glGetPathLengthNV provides a means to obtain arc
                                                                              lengths over specified command sequences for a path. The query
5    Text Handling                                                            glPointAlongPathNV returns an (x, y) point and (dx, dy) tan-
                                                                              gent a given arc length into a path’s command sequence.
5.1 Instanced Rendering
                                                                              These queries are intended to be compatible with queries supported
Efficient rendering of glyphs is very important for any path render-           by OpenVG.
ing system. In addition to the ability to create path objects from
                                                                              The crucial rationale for these queries is they are consistent with
Unicode character points of fonts and query glyph metrics for such
                                                                              our implementation’s internal computations for being inside/out-
path objects, instanced commands for stenciling and covering se-
                                                                              side the path’s stroke or fill and arc length computations (such as
quences of path objects in a single OpenGL command are provided.
                                                                              for dashing).
glStencilFillPathInstancedNV                                    and
glCoverFillPathInstancedNV                      for          filling           7 Antialiasing
and         glStencilStrokePathInstancedNV                      and
glCoverStrokePathInstancedNV for stroking accept                              Applications are expected to render into multisample framebuffers
arrays of path objects where each path object instance has its own            to achieve acceptable antialiasing quality. Use existing APIs to al-
local transformation.                                                         locate multisample framebuffer resources. NV path rendering
This is intended for rendering spans of characters with correspond-           automatically generates multisample coverage when the frame-
ing glyph path objects, but could be used for rendering any se-               buffer supports multisampling.
quence of path objects. To facilitate text, there is a base path object       Applications can also use OpenGL’s accumulation buffer mecha-
value to which each path object offset in the sequence is added. This         nism with jittered rendering to exceed the base multisampling qual-
allows a string of ASCII characters to be provided where the base             ity available.
path object value identifies the base of a range of glyphs specified
with glPathGlyphRangeNV. The array of offsets can even be
a UTF-8 or UTF-16 string to facilitate easy rendering of Unicode              8 More Resources
text.
                                                                              8.1 NVIDIA Resources
The instanced cover commands include a special
GL BOUNDING BOX -OF BOUNDING BOXES           cover   mode
where the bounding boxes of each locally transformed path                     NVIDIA provides developer resources for you to get started pro-
object’s cover geometry is combined (unioned) into a single                   gramming with NV path rendering.
bounding box.                                                                    http://developer.nvidia.com/nv-path-rendering
These instanced commands give the OpenGL implementation the                   NVIDIA’s NV path rendering Path Rendering Software De-
freedom to reorder the geometry sets used during the instanced                velopment Kit (NVprSDK) contains eleven complete examples of
stencil step for better efficiency in the GPU.                                 varying complexity. The most complex example is capable of ren-
                                                                              dering an interesting subset of SVG.
5.2 Spacing and Kerning
                                                                              8.2 Other Resources
Good aesthetics and legibility for horizontal spans of text gener-
ally involves appropriate spacing for the glyphs. When this spac-             The OpenGL Extension Wrangler (GLEW) [Stewart et al. ] in-
ing depends on which pairs of glyphs are mutually adjacent, this is           cludes support for the NV path rendering extension so GLEW
called kerning. We provide a glGetPathSpacingNV query that                    provides a hassle-free way to gain access to the extension’s
accepts a sequence of path objects (in the same way the instanced             OpenGL entry points.
stencil/cover commands do) and returns an array of translations cor-
responding to the kerned spacing of the glyphs.
                                                                              8.3 Driver Availability
The returned array of translations from glGetPathSpacingNV
is immediately suitable to pass as the array of translations used for         The first NVIDIA driver to support NV path rendering is Re-
the local transformation sequence when using the instanced sten-              lease 275.33 (June 2011). Drivers from Release 301.42 (May
cil/cover commands.                                                           2012) have substantially better rendering performance, particu-
                                                                              larly for GeForce 400 and later GPUs (so-called Fermi or Kepler
While applications with complex text layout requirements might                based GPUs). We are continuing to improve the performance of
judge this mechanism insufficiently sophisticated, because the                 NV path rendering so obtain the most recent available driver
mechanism is simple, cross-platform, and generates kerned glyph               version.
translations as expected by the instanced stencil/cover commands,
we anticipate this functionality will meet the basic text layout needs
of many applications.                                                         References
                                                                              A DOBE S YSTEMS. 1985. PostScript Language Reference Manual,
6 Geometric Queries                                                              1st ed. Addison-Wesley Longman Publishing Co., Inc. 1
NV path rendering includes a set of common geometric                          CSS W ORKING G ROUP. 2011. Cascading Style Sheets Level 2 Re-
queries on paths. The queries glIsPointInFillPathNV                             vision 1 (CSS 2.1) Specification, W3C Recommendation. 3



                                                                          6
K HRONOS G ROUP, 2008. OpenVG specification version 1.1. 1
K ILGARD , M., AND B OLZ , J. 2012. Gpu-accelerated path ren-
   dering. ACM Transactions on Graphics (Proceedings of SIG-
   GRAPH Asia 2012) 31, 6 (Nov.), to appear. 1
K ILGARD , M., 2009. EXT direct state access.
   http://www.opengl.org/registry/specs/EXT/direct state access.
   txt . 5
K ILGARD , M., 2012. NV path rendering.
   http://www.opengl.org/registry/specs/NV/path rendering.txt . 1
S EGAL , M., AND A KELEY, K. 2012. The OpenGL Graphics Sys-
   tem: A Specification (Version 4.3 (Compstibility Profile) - August
   6, 2012. 1
S TEWART, N., ET AL . The OpenGL extension wrangler library.
   http://glew.sourceforge.net/ . 6




                                                                      7

More Related Content

What's hot

GTC 2012: NVIDIA OpenGL in 2012
GTC 2012: NVIDIA OpenGL in 2012GTC 2012: NVIDIA OpenGL in 2012
GTC 2012: NVIDIA OpenGL in 2012Mark Kilgard
 
OpenGL 3.2 and More
OpenGL 3.2 and MoreOpenGL 3.2 and More
OpenGL 3.2 and MoreMark Kilgard
 
SIGGRAPH 2012: GPU-Accelerated 2D and Web Rendering
SIGGRAPH 2012: GPU-Accelerated 2D and Web RenderingSIGGRAPH 2012: GPU-Accelerated 2D and Web Rendering
SIGGRAPH 2012: GPU-Accelerated 2D and Web RenderingMark Kilgard
 
Migrating from OpenGL to Vulkan
Migrating from OpenGL to VulkanMigrating from OpenGL to Vulkan
Migrating from OpenGL to VulkanMark Kilgard
 
GPU accelerated path rendering fastforward
GPU accelerated path rendering fastforwardGPU accelerated path rendering fastforward
GPU accelerated path rendering fastforwardMark Kilgard
 
Accelerating Vector Graphics Rendering using the Graphics Hardware Pipeline
Accelerating Vector Graphics Rendering using the Graphics Hardware PipelineAccelerating Vector Graphics Rendering using the Graphics Hardware Pipeline
Accelerating Vector Graphics Rendering using the Graphics Hardware PipelineMark Kilgard
 
NVIDIA OpenGL in 2016
NVIDIA OpenGL in 2016NVIDIA OpenGL in 2016
NVIDIA OpenGL in 2016Mark Kilgard
 
NVIDIA's OpenGL Functionality
NVIDIA's OpenGL FunctionalityNVIDIA's OpenGL Functionality
NVIDIA's OpenGL FunctionalityMark Kilgard
 
An Introduction to NV_path_rendering
An Introduction to NV_path_renderingAn Introduction to NV_path_rendering
An Introduction to NV_path_renderingMark Kilgard
 
CS 354 Vector Graphics & Path Rendering
CS 354 Vector Graphics & Path RenderingCS 354 Vector Graphics & Path Rendering
CS 354 Vector Graphics & Path RenderingMark Kilgard
 
Modern OpenGL Usage: Using Vertex Buffer Objects Well
Modern OpenGL Usage: Using Vertex Buffer Objects Well Modern OpenGL Usage: Using Vertex Buffer Objects Well
Modern OpenGL Usage: Using Vertex Buffer Objects Well Mark Kilgard
 
OpenGL Shading Language
OpenGL Shading LanguageOpenGL Shading Language
OpenGL Shading LanguageJungsoo Nam
 
CS 354 Viewing Stuff
CS 354 Viewing StuffCS 354 Viewing Stuff
CS 354 Viewing StuffMark Kilgard
 
CS 354 Introduction
CS 354 IntroductionCS 354 Introduction
CS 354 IntroductionMark Kilgard
 
CS 354 GPU Architecture
CS 354 GPU ArchitectureCS 354 GPU Architecture
CS 354 GPU ArchitectureMark Kilgard
 
NV_path rendering Functional Improvements
NV_path rendering Functional ImprovementsNV_path rendering Functional Improvements
NV_path rendering Functional ImprovementsMark Kilgard
 
CS 354 Programmable Shading
CS 354 Programmable ShadingCS 354 Programmable Shading
CS 354 Programmable ShadingMark Kilgard
 
vkFX: Effect(ive) approach for Vulkan API
vkFX: Effect(ive) approach for Vulkan APIvkFX: Effect(ive) approach for Vulkan API
vkFX: Effect(ive) approach for Vulkan APITristan Lorach
 

What's hot (20)

GTC 2012: NVIDIA OpenGL in 2012
GTC 2012: NVIDIA OpenGL in 2012GTC 2012: NVIDIA OpenGL in 2012
GTC 2012: NVIDIA OpenGL in 2012
 
OpenGL 3.2 and More
OpenGL 3.2 and MoreOpenGL 3.2 and More
OpenGL 3.2 and More
 
SIGGRAPH 2012: GPU-Accelerated 2D and Web Rendering
SIGGRAPH 2012: GPU-Accelerated 2D and Web RenderingSIGGRAPH 2012: GPU-Accelerated 2D and Web Rendering
SIGGRAPH 2012: GPU-Accelerated 2D and Web Rendering
 
Migrating from OpenGL to Vulkan
Migrating from OpenGL to VulkanMigrating from OpenGL to Vulkan
Migrating from OpenGL to Vulkan
 
GPU accelerated path rendering fastforward
GPU accelerated path rendering fastforwardGPU accelerated path rendering fastforward
GPU accelerated path rendering fastforward
 
Accelerating Vector Graphics Rendering using the Graphics Hardware Pipeline
Accelerating Vector Graphics Rendering using the Graphics Hardware PipelineAccelerating Vector Graphics Rendering using the Graphics Hardware Pipeline
Accelerating Vector Graphics Rendering using the Graphics Hardware Pipeline
 
NVIDIA OpenGL in 2016
NVIDIA OpenGL in 2016NVIDIA OpenGL in 2016
NVIDIA OpenGL in 2016
 
OpenGL 4 for 2010
OpenGL 4 for 2010OpenGL 4 for 2010
OpenGL 4 for 2010
 
NVIDIA's OpenGL Functionality
NVIDIA's OpenGL FunctionalityNVIDIA's OpenGL Functionality
NVIDIA's OpenGL Functionality
 
An Introduction to NV_path_rendering
An Introduction to NV_path_renderingAn Introduction to NV_path_rendering
An Introduction to NV_path_rendering
 
CS 354 Vector Graphics & Path Rendering
CS 354 Vector Graphics & Path RenderingCS 354 Vector Graphics & Path Rendering
CS 354 Vector Graphics & Path Rendering
 
Modern OpenGL Usage: Using Vertex Buffer Objects Well
Modern OpenGL Usage: Using Vertex Buffer Objects Well Modern OpenGL Usage: Using Vertex Buffer Objects Well
Modern OpenGL Usage: Using Vertex Buffer Objects Well
 
OpenGL Shading Language
OpenGL Shading LanguageOpenGL Shading Language
OpenGL Shading Language
 
CS 354 Viewing Stuff
CS 354 Viewing StuffCS 354 Viewing Stuff
CS 354 Viewing Stuff
 
OpenGL for 2015
OpenGL for 2015OpenGL for 2015
OpenGL for 2015
 
CS 354 Introduction
CS 354 IntroductionCS 354 Introduction
CS 354 Introduction
 
CS 354 GPU Architecture
CS 354 GPU ArchitectureCS 354 GPU Architecture
CS 354 GPU Architecture
 
NV_path rendering Functional Improvements
NV_path rendering Functional ImprovementsNV_path rendering Functional Improvements
NV_path rendering Functional Improvements
 
CS 354 Programmable Shading
CS 354 Programmable ShadingCS 354 Programmable Shading
CS 354 Programmable Shading
 
vkFX: Effect(ive) approach for Vulkan API
vkFX: Effect(ive) approach for Vulkan APIvkFX: Effect(ive) approach for Vulkan API
vkFX: Effect(ive) approach for Vulkan API
 

Similar to Programming with NV_path_rendering: An Annex to the SIGGRAPH Asia 2012 paper "GPU-accelerated Path Rendering"

Getting Started with NV_path_rendering
Getting Started with NV_path_renderingGetting Started with NV_path_rendering
Getting Started with NV_path_renderingMark Kilgard
 
13th kandroid OpenGL and EGL
13th kandroid OpenGL and EGL13th kandroid OpenGL and EGL
13th kandroid OpenGL and EGLJungsoo Nam
 
Gdc 14 bringing unreal engine 4 to open_gl
Gdc 14 bringing unreal engine 4 to open_glGdc 14 bringing unreal engine 4 to open_gl
Gdc 14 bringing unreal engine 4 to open_glchangehee lee
 
Advanced Data Science with Apache Spark-(Reza Zadeh, Stanford)
Advanced Data Science with Apache Spark-(Reza Zadeh, Stanford)Advanced Data Science with Apache Spark-(Reza Zadeh, Stanford)
Advanced Data Science with Apache Spark-(Reza Zadeh, Stanford)Spark Summit
 
High performance graphics and computation - OpenGL ES and RenderScript
High performance graphics and computation - OpenGL ES and RenderScript High performance graphics and computation - OpenGL ES and RenderScript
High performance graphics and computation - OpenGL ES and RenderScript BlrDroid
 
GTC 2009 OpenGL Barthold
GTC 2009 OpenGL BartholdGTC 2009 OpenGL Barthold
GTC 2009 OpenGL BartholdMark Kilgard
 
Android open gl2_droidcon_2014
Android open gl2_droidcon_2014Android open gl2_droidcon_2014
Android open gl2_droidcon_2014Droidcon Berlin
 
Liszt los alamos national laboratory Aug 2011
Liszt los alamos national laboratory Aug 2011Liszt los alamos national laboratory Aug 2011
Liszt los alamos national laboratory Aug 2011Ed Dodds
 
Halide - 2
Halide - 2 Halide - 2
Halide - 2 Kobe Yu
 
Hardware Shaders
Hardware ShadersHardware Shaders
Hardware Shadersgueste52f1b
 
openGL basics for sample program (1).ppt
openGL basics for sample program (1).pptopenGL basics for sample program (1).ppt
openGL basics for sample program (1).pptHIMANKMISHRA2
 
openGL basics for sample program.ppt
openGL basics for sample program.pptopenGL basics for sample program.ppt
openGL basics for sample program.pptHIMANKMISHRA2
 
OpenGL ES 2.x Programming Introduction
OpenGL ES 2.x Programming IntroductionOpenGL ES 2.x Programming Introduction
OpenGL ES 2.x Programming IntroductionChamp Yen
 
Computer Graphics - Lecture 01 - 3D Programming I
Computer Graphics - Lecture 01 - 3D Programming IComputer Graphics - Lecture 01 - 3D Programming I
Computer Graphics - Lecture 01 - 3D Programming I💻 Anton Gerdelan
 

Similar to Programming with NV_path_rendering: An Annex to the SIGGRAPH Asia 2012 paper "GPU-accelerated Path Rendering" (20)

Opengl basics
Opengl basicsOpengl basics
Opengl basics
 
Getting Started with NV_path_rendering
Getting Started with NV_path_renderingGetting Started with NV_path_rendering
Getting Started with NV_path_rendering
 
Android native gl
Android native glAndroid native gl
Android native gl
 
13th kandroid OpenGL and EGL
13th kandroid OpenGL and EGL13th kandroid OpenGL and EGL
13th kandroid OpenGL and EGL
 
Cg in Two Pages
Cg in Two PagesCg in Two Pages
Cg in Two Pages
 
Gdc 14 bringing unreal engine 4 to open_gl
Gdc 14 bringing unreal engine 4 to open_glGdc 14 bringing unreal engine 4 to open_gl
Gdc 14 bringing unreal engine 4 to open_gl
 
Advanced Data Science with Apache Spark-(Reza Zadeh, Stanford)
Advanced Data Science with Apache Spark-(Reza Zadeh, Stanford)Advanced Data Science with Apache Spark-(Reza Zadeh, Stanford)
Advanced Data Science with Apache Spark-(Reza Zadeh, Stanford)
 
High performance graphics and computation - OpenGL ES and RenderScript
High performance graphics and computation - OpenGL ES and RenderScript High performance graphics and computation - OpenGL ES and RenderScript
High performance graphics and computation - OpenGL ES and RenderScript
 
Realizing OpenGL
Realizing OpenGLRealizing OpenGL
Realizing OpenGL
 
OpenGL Introduction
OpenGL IntroductionOpenGL Introduction
OpenGL Introduction
 
GTC 2009 OpenGL Barthold
GTC 2009 OpenGL BartholdGTC 2009 OpenGL Barthold
GTC 2009 OpenGL Barthold
 
Android open gl2_droidcon_2014
Android open gl2_droidcon_2014Android open gl2_droidcon_2014
Android open gl2_droidcon_2014
 
Gnn overview
Gnn overviewGnn overview
Gnn overview
 
Liszt los alamos national laboratory Aug 2011
Liszt los alamos national laboratory Aug 2011Liszt los alamos national laboratory Aug 2011
Liszt los alamos national laboratory Aug 2011
 
Halide - 2
Halide - 2 Halide - 2
Halide - 2
 
Hardware Shaders
Hardware ShadersHardware Shaders
Hardware Shaders
 
openGL basics for sample program (1).ppt
openGL basics for sample program (1).pptopenGL basics for sample program (1).ppt
openGL basics for sample program (1).ppt
 
openGL basics for sample program.ppt
openGL basics for sample program.pptopenGL basics for sample program.ppt
openGL basics for sample program.ppt
 
OpenGL ES 2.x Programming Introduction
OpenGL ES 2.x Programming IntroductionOpenGL ES 2.x Programming Introduction
OpenGL ES 2.x Programming Introduction
 
Computer Graphics - Lecture 01 - 3D Programming I
Computer Graphics - Lecture 01 - 3D Programming IComputer Graphics - Lecture 01 - 3D Programming I
Computer Graphics - Lecture 01 - 3D Programming I
 

More from Mark Kilgard

D11: a high-performance, protocol-optional, transport-optional, window system...
D11: a high-performance, protocol-optional, transport-optional, window system...D11: a high-performance, protocol-optional, transport-optional, window system...
D11: a high-performance, protocol-optional, transport-optional, window system...Mark Kilgard
 
Computers, Graphics, Engineering, Math, and Video Games for High School Students
Computers, Graphics, Engineering, Math, and Video Games for High School StudentsComputers, Graphics, Engineering, Math, and Video Games for High School Students
Computers, Graphics, Engineering, Math, and Video Games for High School StudentsMark Kilgard
 
NVIDIA OpenGL and Vulkan Support for 2017
NVIDIA OpenGL and Vulkan Support for 2017NVIDIA OpenGL and Vulkan Support for 2017
NVIDIA OpenGL and Vulkan Support for 2017Mark Kilgard
 
NVIDIA OpenGL 4.6 in 2017
NVIDIA OpenGL 4.6 in 2017NVIDIA OpenGL 4.6 in 2017
NVIDIA OpenGL 4.6 in 2017Mark Kilgard
 
Virtual Reality Features of NVIDIA GPUs
Virtual Reality Features of NVIDIA GPUsVirtual Reality Features of NVIDIA GPUs
Virtual Reality Features of NVIDIA GPUsMark Kilgard
 
EXT_window_rectangles
EXT_window_rectanglesEXT_window_rectangles
EXT_window_rectanglesMark Kilgard
 
OpenGL 4.5 Update for NVIDIA GPUs
OpenGL 4.5 Update for NVIDIA GPUsOpenGL 4.5 Update for NVIDIA GPUs
OpenGL 4.5 Update for NVIDIA GPUsMark Kilgard
 
CS 354 Final Exam Review
CS 354 Final Exam ReviewCS 354 Final Exam Review
CS 354 Final Exam ReviewMark Kilgard
 
CS 354 Surfaces, Programmable Tessellation, and NPR Graphics
CS 354 Surfaces, Programmable Tessellation, and NPR GraphicsCS 354 Surfaces, Programmable Tessellation, and NPR Graphics
CS 354 Surfaces, Programmable Tessellation, and NPR GraphicsMark Kilgard
 
CS 354 Performance Analysis
CS 354 Performance AnalysisCS 354 Performance Analysis
CS 354 Performance AnalysisMark Kilgard
 
CS 354 Acceleration Structures
CS 354 Acceleration StructuresCS 354 Acceleration Structures
CS 354 Acceleration StructuresMark Kilgard
 
CS 354 Global Illumination
CS 354 Global IlluminationCS 354 Global Illumination
CS 354 Global IlluminationMark Kilgard
 
CS 354 Ray Casting & Tracing
CS 354 Ray Casting & TracingCS 354 Ray Casting & Tracing
CS 354 Ray Casting & TracingMark Kilgard
 
CS 354 Bezier Curves
CS 354 Bezier Curves CS 354 Bezier Curves
CS 354 Bezier Curves Mark Kilgard
 

More from Mark Kilgard (15)

D11: a high-performance, protocol-optional, transport-optional, window system...
D11: a high-performance, protocol-optional, transport-optional, window system...D11: a high-performance, protocol-optional, transport-optional, window system...
D11: a high-performance, protocol-optional, transport-optional, window system...
 
Computers, Graphics, Engineering, Math, and Video Games for High School Students
Computers, Graphics, Engineering, Math, and Video Games for High School StudentsComputers, Graphics, Engineering, Math, and Video Games for High School Students
Computers, Graphics, Engineering, Math, and Video Games for High School Students
 
NVIDIA OpenGL and Vulkan Support for 2017
NVIDIA OpenGL and Vulkan Support for 2017NVIDIA OpenGL and Vulkan Support for 2017
NVIDIA OpenGL and Vulkan Support for 2017
 
NVIDIA OpenGL 4.6 in 2017
NVIDIA OpenGL 4.6 in 2017NVIDIA OpenGL 4.6 in 2017
NVIDIA OpenGL 4.6 in 2017
 
Virtual Reality Features of NVIDIA GPUs
Virtual Reality Features of NVIDIA GPUsVirtual Reality Features of NVIDIA GPUs
Virtual Reality Features of NVIDIA GPUs
 
EXT_window_rectangles
EXT_window_rectanglesEXT_window_rectangles
EXT_window_rectangles
 
OpenGL 4.5 Update for NVIDIA GPUs
OpenGL 4.5 Update for NVIDIA GPUsOpenGL 4.5 Update for NVIDIA GPUs
OpenGL 4.5 Update for NVIDIA GPUs
 
CS 354 Final Exam Review
CS 354 Final Exam ReviewCS 354 Final Exam Review
CS 354 Final Exam Review
 
CS 354 Surfaces, Programmable Tessellation, and NPR Graphics
CS 354 Surfaces, Programmable Tessellation, and NPR GraphicsCS 354 Surfaces, Programmable Tessellation, and NPR Graphics
CS 354 Surfaces, Programmable Tessellation, and NPR Graphics
 
CS 354 Performance Analysis
CS 354 Performance AnalysisCS 354 Performance Analysis
CS 354 Performance Analysis
 
CS 354 Acceleration Structures
CS 354 Acceleration StructuresCS 354 Acceleration Structures
CS 354 Acceleration Structures
 
CS 354 Global Illumination
CS 354 Global IlluminationCS 354 Global Illumination
CS 354 Global Illumination
 
CS 354 Ray Casting & Tracing
CS 354 Ray Casting & TracingCS 354 Ray Casting & Tracing
CS 354 Ray Casting & Tracing
 
CS 354 Typography
CS 354 TypographyCS 354 Typography
CS 354 Typography
 
CS 354 Bezier Curves
CS 354 Bezier Curves CS 354 Bezier Curves
CS 354 Bezier Curves
 

Recently uploaded

TrustArc Webinar - How to Build Consumer Trust Through Data Privacy
TrustArc Webinar - How to Build Consumer Trust Through Data PrivacyTrustArc Webinar - How to Build Consumer Trust Through Data Privacy
TrustArc Webinar - How to Build Consumer Trust Through Data PrivacyTrustArc
 
(How to Program) Paul Deitel, Harvey Deitel-Java How to Program, Early Object...
(How to Program) Paul Deitel, Harvey Deitel-Java How to Program, Early Object...(How to Program) Paul Deitel, Harvey Deitel-Java How to Program, Early Object...
(How to Program) Paul Deitel, Harvey Deitel-Java How to Program, Early Object...AliaaTarek5
 
The Role of FIDO in a Cyber Secure Netherlands: FIDO Paris Seminar.pptx
The Role of FIDO in a Cyber Secure Netherlands: FIDO Paris Seminar.pptxThe Role of FIDO in a Cyber Secure Netherlands: FIDO Paris Seminar.pptx
The Role of FIDO in a Cyber Secure Netherlands: FIDO Paris Seminar.pptxLoriGlavin3
 
Merck Moving Beyond Passwords: FIDO Paris Seminar.pptx
Merck Moving Beyond Passwords: FIDO Paris Seminar.pptxMerck Moving Beyond Passwords: FIDO Paris Seminar.pptx
Merck Moving Beyond Passwords: FIDO Paris Seminar.pptxLoriGlavin3
 
Ryan Mahoney - Will Artificial Intelligence Replace Real Estate Agents
Ryan Mahoney - Will Artificial Intelligence Replace Real Estate AgentsRyan Mahoney - Will Artificial Intelligence Replace Real Estate Agents
Ryan Mahoney - Will Artificial Intelligence Replace Real Estate AgentsRyan Mahoney
 
Time Series Foundation Models - current state and future directions
Time Series Foundation Models - current state and future directionsTime Series Foundation Models - current state and future directions
Time Series Foundation Models - current state and future directionsNathaniel Shimoni
 
Visualising and forecasting stocks using Dash
Visualising and forecasting stocks using DashVisualising and forecasting stocks using Dash
Visualising and forecasting stocks using Dashnarutouzumaki53779
 
Digital Identity is Under Attack: FIDO Paris Seminar.pptx
Digital Identity is Under Attack: FIDO Paris Seminar.pptxDigital Identity is Under Attack: FIDO Paris Seminar.pptx
Digital Identity is Under Attack: FIDO Paris Seminar.pptxLoriGlavin3
 
DevEX - reference for building teams, processes, and platforms
DevEX - reference for building teams, processes, and platformsDevEX - reference for building teams, processes, and platforms
DevEX - reference for building teams, processes, and platformsSergiu Bodiu
 
unit 4 immunoblotting technique complete.pptx
unit 4 immunoblotting technique complete.pptxunit 4 immunoblotting technique complete.pptx
unit 4 immunoblotting technique complete.pptxBkGupta21
 
The Ultimate Guide to Choosing WordPress Pros and Cons
The Ultimate Guide to Choosing WordPress Pros and ConsThe Ultimate Guide to Choosing WordPress Pros and Cons
The Ultimate Guide to Choosing WordPress Pros and ConsPixlogix Infotech
 
Moving Beyond Passwords: FIDO Paris Seminar.pdf
Moving Beyond Passwords: FIDO Paris Seminar.pdfMoving Beyond Passwords: FIDO Paris Seminar.pdf
Moving Beyond Passwords: FIDO Paris Seminar.pdfLoriGlavin3
 
TeamStation AI System Report LATAM IT Salaries 2024
TeamStation AI System Report LATAM IT Salaries 2024TeamStation AI System Report LATAM IT Salaries 2024
TeamStation AI System Report LATAM IT Salaries 2024Lonnie McRorey
 
The State of Passkeys with FIDO Alliance.pptx
The State of Passkeys with FIDO Alliance.pptxThe State of Passkeys with FIDO Alliance.pptx
The State of Passkeys with FIDO Alliance.pptxLoriGlavin3
 
How AI, OpenAI, and ChatGPT impact business and software.
How AI, OpenAI, and ChatGPT impact business and software.How AI, OpenAI, and ChatGPT impact business and software.
How AI, OpenAI, and ChatGPT impact business and software.Curtis Poe
 
Anypoint Exchange: It’s Not Just a Repo!
Anypoint Exchange: It’s Not Just a Repo!Anypoint Exchange: It’s Not Just a Repo!
Anypoint Exchange: It’s Not Just a Repo!Manik S Magar
 
Take control of your SAP testing with UiPath Test Suite
Take control of your SAP testing with UiPath Test SuiteTake control of your SAP testing with UiPath Test Suite
Take control of your SAP testing with UiPath Test SuiteDianaGray10
 
SALESFORCE EDUCATION CLOUD | FEXLE SERVICES
SALESFORCE EDUCATION CLOUD | FEXLE SERVICESSALESFORCE EDUCATION CLOUD | FEXLE SERVICES
SALESFORCE EDUCATION CLOUD | FEXLE SERVICESmohitsingh558521
 
Tampa BSides - Chef's Tour of Microsoft Security Adoption Framework (SAF)
Tampa BSides - Chef's Tour of Microsoft Security Adoption Framework (SAF)Tampa BSides - Chef's Tour of Microsoft Security Adoption Framework (SAF)
Tampa BSides - Chef's Tour of Microsoft Security Adoption Framework (SAF)Mark Simos
 
The Fit for Passkeys for Employee and Consumer Sign-ins: FIDO Paris Seminar.pptx
The Fit for Passkeys for Employee and Consumer Sign-ins: FIDO Paris Seminar.pptxThe Fit for Passkeys for Employee and Consumer Sign-ins: FIDO Paris Seminar.pptx
The Fit for Passkeys for Employee and Consumer Sign-ins: FIDO Paris Seminar.pptxLoriGlavin3
 

Recently uploaded (20)

TrustArc Webinar - How to Build Consumer Trust Through Data Privacy
TrustArc Webinar - How to Build Consumer Trust Through Data PrivacyTrustArc Webinar - How to Build Consumer Trust Through Data Privacy
TrustArc Webinar - How to Build Consumer Trust Through Data Privacy
 
(How to Program) Paul Deitel, Harvey Deitel-Java How to Program, Early Object...
(How to Program) Paul Deitel, Harvey Deitel-Java How to Program, Early Object...(How to Program) Paul Deitel, Harvey Deitel-Java How to Program, Early Object...
(How to Program) Paul Deitel, Harvey Deitel-Java How to Program, Early Object...
 
The Role of FIDO in a Cyber Secure Netherlands: FIDO Paris Seminar.pptx
The Role of FIDO in a Cyber Secure Netherlands: FIDO Paris Seminar.pptxThe Role of FIDO in a Cyber Secure Netherlands: FIDO Paris Seminar.pptx
The Role of FIDO in a Cyber Secure Netherlands: FIDO Paris Seminar.pptx
 
Merck Moving Beyond Passwords: FIDO Paris Seminar.pptx
Merck Moving Beyond Passwords: FIDO Paris Seminar.pptxMerck Moving Beyond Passwords: FIDO Paris Seminar.pptx
Merck Moving Beyond Passwords: FIDO Paris Seminar.pptx
 
Ryan Mahoney - Will Artificial Intelligence Replace Real Estate Agents
Ryan Mahoney - Will Artificial Intelligence Replace Real Estate AgentsRyan Mahoney - Will Artificial Intelligence Replace Real Estate Agents
Ryan Mahoney - Will Artificial Intelligence Replace Real Estate Agents
 
Time Series Foundation Models - current state and future directions
Time Series Foundation Models - current state and future directionsTime Series Foundation Models - current state and future directions
Time Series Foundation Models - current state and future directions
 
Visualising and forecasting stocks using Dash
Visualising and forecasting stocks using DashVisualising and forecasting stocks using Dash
Visualising and forecasting stocks using Dash
 
Digital Identity is Under Attack: FIDO Paris Seminar.pptx
Digital Identity is Under Attack: FIDO Paris Seminar.pptxDigital Identity is Under Attack: FIDO Paris Seminar.pptx
Digital Identity is Under Attack: FIDO Paris Seminar.pptx
 
DevEX - reference for building teams, processes, and platforms
DevEX - reference for building teams, processes, and platformsDevEX - reference for building teams, processes, and platforms
DevEX - reference for building teams, processes, and platforms
 
unit 4 immunoblotting technique complete.pptx
unit 4 immunoblotting technique complete.pptxunit 4 immunoblotting technique complete.pptx
unit 4 immunoblotting technique complete.pptx
 
The Ultimate Guide to Choosing WordPress Pros and Cons
The Ultimate Guide to Choosing WordPress Pros and ConsThe Ultimate Guide to Choosing WordPress Pros and Cons
The Ultimate Guide to Choosing WordPress Pros and Cons
 
Moving Beyond Passwords: FIDO Paris Seminar.pdf
Moving Beyond Passwords: FIDO Paris Seminar.pdfMoving Beyond Passwords: FIDO Paris Seminar.pdf
Moving Beyond Passwords: FIDO Paris Seminar.pdf
 
TeamStation AI System Report LATAM IT Salaries 2024
TeamStation AI System Report LATAM IT Salaries 2024TeamStation AI System Report LATAM IT Salaries 2024
TeamStation AI System Report LATAM IT Salaries 2024
 
The State of Passkeys with FIDO Alliance.pptx
The State of Passkeys with FIDO Alliance.pptxThe State of Passkeys with FIDO Alliance.pptx
The State of Passkeys with FIDO Alliance.pptx
 
How AI, OpenAI, and ChatGPT impact business and software.
How AI, OpenAI, and ChatGPT impact business and software.How AI, OpenAI, and ChatGPT impact business and software.
How AI, OpenAI, and ChatGPT impact business and software.
 
Anypoint Exchange: It’s Not Just a Repo!
Anypoint Exchange: It’s Not Just a Repo!Anypoint Exchange: It’s Not Just a Repo!
Anypoint Exchange: It’s Not Just a Repo!
 
Take control of your SAP testing with UiPath Test Suite
Take control of your SAP testing with UiPath Test SuiteTake control of your SAP testing with UiPath Test Suite
Take control of your SAP testing with UiPath Test Suite
 
SALESFORCE EDUCATION CLOUD | FEXLE SERVICES
SALESFORCE EDUCATION CLOUD | FEXLE SERVICESSALESFORCE EDUCATION CLOUD | FEXLE SERVICES
SALESFORCE EDUCATION CLOUD | FEXLE SERVICES
 
Tampa BSides - Chef's Tour of Microsoft Security Adoption Framework (SAF)
Tampa BSides - Chef's Tour of Microsoft Security Adoption Framework (SAF)Tampa BSides - Chef's Tour of Microsoft Security Adoption Framework (SAF)
Tampa BSides - Chef's Tour of Microsoft Security Adoption Framework (SAF)
 
The Fit for Passkeys for Employee and Consumer Sign-ins: FIDO Paris Seminar.pptx
The Fit for Passkeys for Employee and Consumer Sign-ins: FIDO Paris Seminar.pptxThe Fit for Passkeys for Employee and Consumer Sign-ins: FIDO Paris Seminar.pptx
The Fit for Passkeys for Employee and Consumer Sign-ins: FIDO Paris Seminar.pptx
 

Programming with NV_path_rendering: An Annex to the SIGGRAPH Asia 2012 paper "GPU-accelerated Path Rendering"

  • 1. Programming with NV path rendering: An Annex to the SIGGRAPH paper GPU-accelerated Path Rendering Mark J. Kilgard NVIDIA Corporation∗ Abstract For example, PostScript [Adobe Systems 1985] provides three commands (arc, arcn, and arct) for specifying circular arc This annex provides a practical overview of the OpenGL-based pro- segments. While standards developed after PostScript sought to gramming interface described in our SIGGRAPH Asia 2012 paper generalize circular arc segments to an elliptical form, our inter- GPU-accelerated Path Rendering. face supports circular arc commands to match PostScript’s param- eterization. So rather than require an application to convert such PostScript circular paths into some alternate form, the circular arc Keywords: NV path rendering, path rendering, vector graphics, commands are handled with semantics exactly matching PostScript. OpenGL, stencil buffer Likewise, OpenVG [Khronos Group 2008] has a four elliptical arc segment commands, each expecting five coordinate values; whereas 1 Introduction SVG has a single elliptical arc segment command with five contin- uous coordinate values and two Boolean coordinates. Our SIGGRAPH Asia paper GPU-accelerated Path Rendering For line segments, the general line segment command takes an [Kilgard and Bolz 2012] describes a system for accelerating vec- (x, y) control point—but horizontal and vertical line segments take tor graphics on GPUs. NVIDIA has implemented the system a single horizontal or vertical coordinate respectively. and has been shipping the functionality for its GeForce and Quadro GPUs since the summer of 2011. We refer the reader to For B´ zier curve segments, commands exist for smooth B´ zier seg- e e that paper for the motivation and technical underpinning of the ments, matching up with the prior command’s segment to provide NV path rendering [Kilgard 2012] OpenGL extension. In par- C1 continuity. ticular, that paper explains our “Stencil, then Cover” (StC) approach to filling and stenciling paths. Where appropriate, we provide relative and absolute versions of all path commands. With relative commands, path coordinates indicat- In this annex to the forementioned paper we explain the pro- ing a position are relative to the end point of the prior path segment. gramming interface in more detail. The intended audience for this annex is developers evaluating and learning to program In addition to eliminating the semantic gap between other path stan- NV path rendering. You should be familiar with the OpenGL dards and our interface, we note that paths can be represented with [Segal and Akeley 2012] programming interface. Familiarity with fewer path coordinates when the variety of available path com- path rendering standards such as PostScript or SVG is helpful. mands is broad. Also, editing of the sequence of path commands and coordinates is straightforward when each standard’s path com- Figure 1 shows how our new path pipeline co-exists with the ex- mand vocabulary is supported directly. Table 1 organizes the sup- isting pipelines in OpenGL for pixel and vertex processing. Your ported path commands. application can mix traditional OpenGL usage with path rendering. Path objects are specified in four ways: 2 Path Object Specification 1. Explicitly, from a sequence of path commands and their cor- responding path coordinates. Before an application can render paths, it must create a path ob- ject corresponding to each path. A path object is a container for 2. From a string conforming to a standard grammar for specify- the sequence of path commands and corresponding coordinates ing a paths. Both PostScript and SVG have standard gram- for the path. Additionally, each path object maintains per-object mars for paths—and we support both. parameters (see Section 3) and the “baked” GPU-resident state 3. From a Unicode character point of an outline font. A font can needed to stencil and cover the path object. Like other types of be specified with a system name (such as Helvetica or Arial), objects in OpenGL, path objects are named by 32-bit unsigned in- an outline font filename, or a built-in font. tegers. Names of path objects can be generated, tested for existence, and deleted respectively with glGenPathsNV, glIsPathNV, 4. Derived from one or more existing path objects. The new and glDeletePathsNV commands—matching the mechanism path may be the result of an arbitrary projective transform of OpenGL uses for texture, buffer, and display list objects. an existing path, or the linear weighting of exiting paths with matching command sequences. 2.1 Path Segment Commands 2.2 Explicit Path Specification The path commands supported by NV path rendering are the union of path commands from all major path rendering standards. The command We designed NV path rendering to be a low-level interface upon which all major path rendering standards can be hosted. Elim- void glPathCommandsNV(GLuint path, GLsizei numCmds, inating any semantic friction between the path commands of vari- const GLubyte *cmds, ous standards and our interface is important to us. GLsizei numCoords, GLenum coordType, ∗ e-mail: mjk@nvidia.com const void *coords); 1
  • 2. Relative Number of scalar Character Path command version coordinates alias Origin GL MOVE TO NV 2 M/m all GL LINE TO NV 2 L/l all GL HORIZONTAL LINE NV 1 H/h SVG GL VERTICAL LINE NV 1 V/v SVG GL QUADRATIC CURVE TO NV 4 Q/q SVG GL CUBIC CURVE TO NV 6 C/c all GL SMOOTH QUADRATIC CURVE TO NV 2 T/t SVG GL SMOOTH CUBIC CURVE TO NV 4 S/s SVG GL SMALL CCW ARC TO NV 5 - OpenVG GL SMALL CW ARC TO NV 5 - OpenVG GL LARGE CCW ARC TO NV 5 - OpenVG GL LARGE CW ARC TO NV 5 - OpenVG GL ARC TO NV 7 A/a SVG GL CIRCULAR CCW ARC TO NV 5 - PostScript GL CIRCULAR CW ARC TO NV 5 - PostScript GL CIRCULAR TANGENT ARC TO NV 5 - PostScript GL RECT NV 4 - PDF GL DUP FIRST CUBIC CURVE TO NV 4 - PDF GL DUP LAST CUBIC CURVE TO NV 4 - PDF GL RESTART PATH NV 0 - PostScript GL CLOSE PATH NV 0 - all Table 1: Path commands supported by NV path rendering. The character alias column provides an ASCII alias for the absolute/relative version of token. The “all” for origin means the path command is common to all path rendering standards. The following code fragment creates path object 42 containing the contours of a five-point star and heart: static const GLubyte pathCommands[10] = { GL_MOVE_TO_NV, GL_LINE_TO_NV, GL_LINE_TO_NV, GL_LINE_TO_NV, GL_LINE_TO_NV, GL_CLOSE_PATH_NV, ’M’, ’C’, ’C’, ’Z’ }; // character aliases static const GLshort pathCoords[12][2] = { {100,180}, {40,10}, {190,120}, {10,120}, {160,10}, {300,300}, {100,400}, {100,200}, {300,100}, {500,200}, {500,400}, {300,300} }; GLuint pathObj = 42; glPathCommandsNV(pathObj, 10, pathCommands, 24, GL_SHORT, pathCoords); The example demonstrates how tokens or character aliases can be used interchangeably to specify a path. 2.3 Grammars for Path Specification Figure 1: High-level data flow of OpenGL showing pixel, vertex, and new path pipelines. The command glPathStringNV(GLuint path, GLenum format, GLsizei length, const void *pathString); specifies a new path object named path where numCmds indi- cates the number of path commands, read from the array com- specifies a new path object named path where format must be mands, with which to initialize that path’s command sequence. either GL PATH FORMAT SVG NV or GL PATH FORMAT PS NV, These path commands reference coordinates read sequentially from in which case the length and pathString are interpreted respec- the coords array. The type of the coordinates read from the tively according to SVG’s grammar1 for paths or PostScript’s sub- coords array is determined by the coordType parameter which grammar for user paths. This code fragment is functionally identi- must be one of GL BYTE, GL UNSIGNED BYTE, GL SHORT, cal to the prior explicit path specification example but uses an SVG GL UNSIGNED SHORT, or GL FLOAT. Coordinates supplied in path string: more compact data types allows paths to be stored more efficiently. const char *svgPathString = // star M100,180 L40,10 L190,120 L10,120 L160,10 z The numCmds elements of the cmds array must be tokens (or char- // heart acter aliases) from Table 1. The command sequence matches the el- M300 300 ement order of the cmds array. Each command references a number of coordinates specified by the “Number of scalar coordinates” col- 1 The Backus-Naur Form (BNF) description of the SVG path gram- umn of Table 1, starting with the first (zero) element of the coords mar is found here http://www.w3.org/TR/SVG/paths.html# array and advancing by the coordinate count for each command. PathDataBNF 2
  • 3. C100 400,100 200,300 100,500 200,500 400,300 300Z; GLuint pathTemplate = ˜0; // Biggest path name glPathStringNV(pathObj, GL_PATH_FORMAT_SVG_NV, glPathCommandsNV(pathTemplate, (GLsizei)strlen(svgPathString), svgPathString); 0, NULL, 0, GL_FLOAT, NULL); glPathParameterfNV(pathTemplate, GL_PATH_STROKE_WIDTH_NV, emScale*0.1f); Creating paths from strings has proven very convenient and avoids glPathParameteriNV(pathTemplate, having each application re-implement standard path grammar GL_PATH_JOIN_STYLE_NV, GL_MITER_TRUNCATE_NV); parsers. glPathParameterfNV(pathTemplate, GL_PATH_MITER_LIMIT_NV, 1.0); 2.4 Specifying Paths from Glyphs of a Font // Create path object range for Latin-1 character codes GLuint glyphBase = glGenPathsNV(numChars); Text rendering is a first-class feature in every major path render- // Typeface names in priority order struct { ing API and standard. Requiring applications to load outlines of GLenum fontTarget; glyphs is just too common, not to mention arduous and platform- const char *name; dependent, so NV path rendering provides a mechanism for } font[] = { applications to create path objects from glyphs—including contigu- { GL_SYSTEM_FONT_NAME_NV, Liberation Sans }, ous ranges of glyphs indexed by their Unicode character point. { GL_SYSTEM_FONT_NAME_NV, Verdana }, { GL_SYSTEM_FONT_NAME_NV, Arial }, Two commands glPathGlyphRangeNV and // Final standard font provides guaranteed supported glPathGlyphsNV create a sequence of path objects given { GL_STANDARD_FONT_NAME_NV, Sans } a font and a range or sequence of Unicode character points for the }; font. The font can be specified using a system font name (such const int numFonts = sizeof(font)/sizeof(font[0]); as “Arial” or “Helvetica” with a file name for a file in a standard for (int i=0; i numFonts; i++) { // For each font font file format such as TrueType, or a built-in font name (such glPathGlyphRangeNV(glyphBase, as “Sans,” “Serif,” or “Mono”) that is guaranteed to be available font[i].fontTarget, font[i].name, GL_BOLD_BIT_NV, 0, numChars, GL_USE_MISSING_GLYPH_NV, on every NV path rendering implementation, regardless of pathTemplate, emScale); platform. } Once these path objects are populated, these glyph path objects can be stenciled and covered, whether filled or stroked, just like any Path objects loaded from glyphs also have associated glyph and other path object. font metrics loaded corresponding to their character point. These metrics and spacing information are discussed in Section 5. The glPathGlyphRangeNV and glPathGlyphsNV com- mands will only create a path object for a given path name if that 2.5 Copied, Weighted, and Transformed Paths path object name does not already correspond to an existing path object. This behavior is designed to populate path object ranges Additional commands for specifying path objects work by generat- with glyph outlines consistent with the font-family property ing a new path object from one or more existing path objects. The of CSS 2.1 [CSS Working Group 2011]. An application can load a glCopyPathNV command is the simplest and simply copies the sequence of fonts for a given range of path objects repeatedly know- state of a named existing path object to another path object name. ing this will resolve to some supported set of font glyphs eventually. Path parameters and glyph metrics are copied by glCopyPathNV. The glPathGlyphRangeNV command has the following proto- The glInterpolatePathsNV command takes two (source) type: path object names and a weighting factor and creates a void glPathGlyphRangeNV(GLuint firstPathName, new (destination) path object that is the linear interpo- GLenum fontTarget, lation based on the weighting factor of the two source GLconst void *fontName, paths. The glWeightPathsNV command generalizes the GLbitfield fontStyle, glInterpolatePathsNV to linear combination of a specified GLuint firstGlyph, number of source path objects and corresponding weighting fac- GLsizei numGlyphs, GLenum handleMissingGlyphs, tors. All the path objects involved in interpolating or weighting GLuint pathParameterTemplate, must have identical path command sequences and contain no circu- GLfloat emScale); lar or elliptical arc segment commands. The destination path ob- ject’s parameters are copied from the first destination path object; The emScale parameter allows fonts of different formats to be glyph metrics are all set invalid (to -1). loaded with a consistent number of path units per em (a typographic The glTransformPathNV command take a source path object measure of glyph scale). Path coordinates and glyph metrics are name and generates a new named destination path object corre- scaled to match the specified emScale. To ensure all path objects in sponding to the destination path object transformed by an affine lin- a range of glyphs have a consistent set of path parameters, the path- ear transform. Path commands such as horizontal or vertical lines ParameterTemplate path object names a path object from which the or circular arcs may be promoted to a more general path command new glyph path objects should copy their parameters. form as required to perform the transformation. Relative commands This example shows how a range of path objects for sans serif fonts are converted to absolute commands, transformed, and then con- for the Latin-1 character range can be populated: verted back to relative commands. // Constants If the destination path object name refers to an existing path object, const GLint numChars = 256; // ISO/IEC 8859-1 that path object is replaced (implicitly deleting the old object) with // 8-bit range the new path object. The destination name may be one of the source const GLfloat emScale = 2048; // TrueType path names. // units per em Assuming the implementation performs a lazy copy of path // Create empty path object for use as parameter template commands and coordinates, glCopyPathNV allows effi- 3
  • 4. cient rendering of a path with different stroking parameters. glInterpolatePathsNV can help implement Flash’s Shape Morph functionality and OpenVG’s vgInterpolatePath command. glTransformPathNV can help implement SVG 1.2’s non-scaling stroke functionality and OpenVG’s vgTransformPath. 3 Path Parameters Every path object has state in addition to its sequence of path com- mands and coordinates. 3.1 Settable Parameters Figure 2: Glyph metrics. The glPathParameteriNV, glPathParameterfNV, glPathParameterivNV, and glPathParameterfvNV and glGetPathParameterfvNV, the dashing array with commands respectively set path parameters of a specified path glGetPathDashArrayNV, the path command array with object given integer or float data supplied by a scalar parameter or glGetPathCommandsNV, and path coordinate array with vector array. glGetPathCoordsNV. Additionally, computed parameters for each path object can be queried; see Table 3. Table 2 summarizes the settable parameters. Many parameters deal with embellishments to stroking such as the stroke width, join style, miter limit, end caps, and dash caps. Name Type GL PATH COMMAND COUNT NV N GL PATH COORD COUNT NV N Name Type Initial value GL PATH COMPUTED LENGTH NV + GL PATH STROKE WIDTH NV + 1.0 GL PATH OBJECT BOUNDING BOX NV 4× GL PATH JOIN STYLE NV 4-valued GL MITER REVERT NV GL PATH FILL BOUNDING BOX NV 4× GL PATH MITER LIMIT NV + 4 GL PATH STROKE BOUNDING BOX NV 4× GL PATH INITIAL END CAP NV 4-valued GL FLAT GL PATH TERMINAL END CAP NV 4-valued GL FLAT Table 3: Computed path object parameters. GL PATH INITIAL DASH CAP NV 4-valued GL FLAT GL PATH TERMINAL DASH CAP NV 4-valued GL FLAT GL PATH DASH OFFSET NV 0.0 GL PATH DASH OFFSET RESET NV 2-valued GL MOVE TO CONTINUES NV 3.4 Glyph and Font Metrics GL PATH CLIENT LENGTH NV + 0.0 GL PATH FILL MODE NV 4-valued GL COUNT UP NV GL PATH FILL MASK NV mask all 1’s Path objects created from character points from a font are tagged GL PATH FILL COVER MODE NV 3-valued GL CONVEX HULL NV with additional read-only glyph metrics. These metrics are use- GL PATH STROKE COVER MODE NV 3-valued GL CONVEX HULL NV ful for text layout. Additionally, every glyph has aggregate per-font GL PATH STROKE MASK NV mask all 1’s metrics for its corresponding font. The metrics are obtained directly from the font except for any scaling based on the emScale. The Table 2: Settable path object parameters. glGetPathMetricRangeNV and glGetPathMetricsNV queries return the glyph and per-font metrics for a range or se- quence of path objects respectively. 3.2 Dashing State As shown in Figure 2, the glyph metrics provide each glyph’s width and height and (x, y) bearing and advance for both horizontal and Dashing is an embellishment to stroking where a repeated pattern vertical layout. These metrics are expressed in path space units. of enabled stroking and gaps in stroking is applied during stroking. The conventional glPathParameteriNV, etc. commands are Additional per-font metrics can be queried from any glyph belong- ill-suited to setting a variable number of dash offsets. ing to a particular font. These metrics include a bounding box large enough to contain any glyph in the font, the native number of font Instead parameters to control the dash pattern of a stroked path are units per em, the font-wide ascender, descender, and height dis- specified by the command tances, maximum advance for horizontal and vertical layout, un- derline position and thickness. void glPathDashArrayNV(GLuint path, GLsizei dashCount, Requested metrics are specified in a bitmask and returned to an const GLfloat *dashArray); application-provided array of floats. where path is the name of an existing path object. A dashCount of zero indicates the path object is not dashed; in this case, the 4 Rendering Paths via Stencil, then Cover dashArray is not accessed. Otherwise, dashCount provides a count of how many float values to read from the dashArray array. Once a path object is created, it can be rendered with the “stencil, then cover” approach. 3.3 Computed Parameters and Querying State The mapping from path space to clip space and ultimately win- dow space is determined by OpenGL’s standard modelview, pro- All settable path object state is able to be queried; this in- jection, viewport, and depth range transforms. An OpenGL pro- cludes settable parameters with glGetPathParameterivNV grammer familiar with OpenGL’s glMatrixMode, glRotatef, 4
  • 5. glTranslatef, etc. matrix commands for transforming 3D ge- ometry uses the same commands to manipulate the transformations of path objects. For example, the code below establishes an orthographic path-to- clip-space to map the [0..500] × [0..400] region used by the star- and-heart path: glMatrixLoadIdentityEXT(GL_PROJECTION); glMatrixLoadIdentityEXT(GL_MODELVIEW); glMatrixOrthoEXT(GL_MODELVIEW, 0, 500, 0, 400, -1, 1); This code demonstrates OpenGL’s selector-free matrix manipula- tion commands introduced by the EXT direct state access (DSA) extension [Kilgard 2009]. 4.1 Path Rendering in Two Steps Now we can render the filled and stroked star-and-heart path. We assume the stencil buffer has been initially cleared to zero. Stencil Step for Filling First we stencil the filled region Figure 3: Filled and stroked path rendering result. of the star-and-heart path into the stencil buffer with the glStencilFillPathNV command: glStencilFillPathNV(pathObj, GL_COUNT_UP_NV, 0x1F); This computes the point containment of every sample in the frame- buffer w.r.t. the stroked path—and if the sample is contained in the The winding number of each sample in the framebuffer w.r.t. the path’s stroke, the sample’s stencil value is set to 0x1 with a write transformed path is added (GL COUNT UP) to the stencil value cor- mask of bit-inverted zero (writing all stencil bits). responding to each rasterized same. The 0x1F mask indicates that only the five least significant stencil bits are modified—effectively Cover Step for Stroking Second we conservatively cover the resulting in modulo-32 addition. More typically, this mask will be previously stenciled stroked region of the star-and heart path. We 0xFF. leave stencil as configured previously—non-zero values will in- clude the 0x1 value written by the glStencilStrokePathNV Instead of GL COUNT UP, we could also subtract command, but we change the color to yellow: (GL COUNT DOWN) or invert bits (GL INVERT) by a count equal to each sample’s winding number w.r.t. the transformed path. glColor3f(1,1,0); // yellow glCoverStrokePathNV(pathObj, CONVEX_HULL); Cover Step for Filling Second we conservatively cover the previ- ously stenciled filled region of the star-and heart path. The shading, The complete rendering result is shown in Figure 3. stencil testing, and blending are fully controlled by the application’s OpenGL context state during the cover. So we first enable stencil 4.2 Accessible Samples testing to discard color samples with a stencil value of zero (those not in the path as determined by the prior stencil step); for samples that survive the stencil test, we want to reset the stencil value to The fill and stroke stencil/cover commands conceptually operate zero and shade the corresponding sample’s color value green. So: on all samples in the framebuffer. Potentially every sample in the framebuffer could be updated by these commands. However, the set glEnable(GL_STENCIL_TEST); of accessible samples be restricted the by current OpenGL context glStencilFunc(GL_NOTEQUAL, 0, 0x1F); state. glStencilOp(GL_KEEP, GL_KEEP, GL_ZERO); glColor3f(0,1,0); // green Clip planes, polygon stipple, window ownership, scissoring, stencil glCoverFillPathNV(pathObj, GL_BOUNDING_BOX_NV); testing (on write masked stencil bits during stencil fill/stroke op- erations), depth testing, depth bounds testing, and the multisample The result is a green star to the left of a green heart. mask all limit, when enabled, the accessible samples. The cover fill/stroke commands further limit the updated samples Stencil Step for Stroking Stroking proceeds similarly in two to the bounding box or convex hull (depending on the cover mode). steps; however before rendering, we configure the path object with desirable path parameters for stroking. Specify a wider 6.5-unit stroke and the round join style: 4.3 Path Coordinate Generation glPathParameteriNV(pathObj, Paths do not have per-vertex attributes such as colors and texture co- GL_PATH_JOIN_STYLE_NV, GL_ROUND_NV); ordinates that are interpolated over geometric primitives as 3D ge- glPathParameterfNV(pathObj, GL_PATH_STROKE_WIDTH_NV, 6.5); ometry does. Instead varying attributes used by the fragment shader must be generated as a linear function of the path-space coordi- nate system. The glPathColorGenNV, glPathTexGenNV, Now we first stencil the stroked coverage for the heart-and-star path and glPathFogGenNV command generated color, texture coor- into the stencil buffer: dinate sets, and the fog coordinate respectively; the loosely mimic glStencilStrokePathNV(pathObj, 0x1, ˜0); OpenGL’s fixed-function glTexGenfvNV, etc. commands. 5
  • 6. To match a common idiom in path rendering standards, the path co- and glIsPointInStrokePathNV provide efficient determi- ordinate generation supports mapping a path’s path space bounding nations of whether an (x, y) point in a path’s local coordinate box to a normalized [0..1] × [0..1] square. system is inside or outside the fill or stroke of the path. The query glGetPathLengthNV provides a means to obtain arc lengths over specified command sequences for a path. The query 5 Text Handling glPointAlongPathNV returns an (x, y) point and (dx, dy) tan- gent a given arc length into a path’s command sequence. 5.1 Instanced Rendering These queries are intended to be compatible with queries supported Efficient rendering of glyphs is very important for any path render- by OpenVG. ing system. In addition to the ability to create path objects from The crucial rationale for these queries is they are consistent with Unicode character points of fonts and query glyph metrics for such our implementation’s internal computations for being inside/out- path objects, instanced commands for stenciling and covering se- side the path’s stroke or fill and arc length computations (such as quences of path objects in a single OpenGL command are provided. for dashing). glStencilFillPathInstancedNV and glCoverFillPathInstancedNV for filling 7 Antialiasing and glStencilStrokePathInstancedNV and glCoverStrokePathInstancedNV for stroking accept Applications are expected to render into multisample framebuffers arrays of path objects where each path object instance has its own to achieve acceptable antialiasing quality. Use existing APIs to al- local transformation. locate multisample framebuffer resources. NV path rendering This is intended for rendering spans of characters with correspond- automatically generates multisample coverage when the frame- ing glyph path objects, but could be used for rendering any se- buffer supports multisampling. quence of path objects. To facilitate text, there is a base path object Applications can also use OpenGL’s accumulation buffer mecha- value to which each path object offset in the sequence is added. This nism with jittered rendering to exceed the base multisampling qual- allows a string of ASCII characters to be provided where the base ity available. path object value identifies the base of a range of glyphs specified with glPathGlyphRangeNV. The array of offsets can even be a UTF-8 or UTF-16 string to facilitate easy rendering of Unicode 8 More Resources text. 8.1 NVIDIA Resources The instanced cover commands include a special GL BOUNDING BOX -OF BOUNDING BOXES cover mode where the bounding boxes of each locally transformed path NVIDIA provides developer resources for you to get started pro- object’s cover geometry is combined (unioned) into a single gramming with NV path rendering. bounding box. http://developer.nvidia.com/nv-path-rendering These instanced commands give the OpenGL implementation the NVIDIA’s NV path rendering Path Rendering Software De- freedom to reorder the geometry sets used during the instanced velopment Kit (NVprSDK) contains eleven complete examples of stencil step for better efficiency in the GPU. varying complexity. The most complex example is capable of ren- dering an interesting subset of SVG. 5.2 Spacing and Kerning 8.2 Other Resources Good aesthetics and legibility for horizontal spans of text gener- ally involves appropriate spacing for the glyphs. When this spac- The OpenGL Extension Wrangler (GLEW) [Stewart et al. ] in- ing depends on which pairs of glyphs are mutually adjacent, this is cludes support for the NV path rendering extension so GLEW called kerning. We provide a glGetPathSpacingNV query that provides a hassle-free way to gain access to the extension’s accepts a sequence of path objects (in the same way the instanced OpenGL entry points. stencil/cover commands do) and returns an array of translations cor- responding to the kerned spacing of the glyphs. 8.3 Driver Availability The returned array of translations from glGetPathSpacingNV is immediately suitable to pass as the array of translations used for The first NVIDIA driver to support NV path rendering is Re- the local transformation sequence when using the instanced sten- lease 275.33 (June 2011). Drivers from Release 301.42 (May cil/cover commands. 2012) have substantially better rendering performance, particu- larly for GeForce 400 and later GPUs (so-called Fermi or Kepler While applications with complex text layout requirements might based GPUs). We are continuing to improve the performance of judge this mechanism insufficiently sophisticated, because the NV path rendering so obtain the most recent available driver mechanism is simple, cross-platform, and generates kerned glyph version. translations as expected by the instanced stencil/cover commands, we anticipate this functionality will meet the basic text layout needs of many applications. References A DOBE S YSTEMS. 1985. PostScript Language Reference Manual, 6 Geometric Queries 1st ed. Addison-Wesley Longman Publishing Co., Inc. 1 NV path rendering includes a set of common geometric CSS W ORKING G ROUP. 2011. Cascading Style Sheets Level 2 Re- queries on paths. The queries glIsPointInFillPathNV vision 1 (CSS 2.1) Specification, W3C Recommendation. 3 6
  • 7. K HRONOS G ROUP, 2008. OpenVG specification version 1.1. 1 K ILGARD , M., AND B OLZ , J. 2012. Gpu-accelerated path ren- dering. ACM Transactions on Graphics (Proceedings of SIG- GRAPH Asia 2012) 31, 6 (Nov.), to appear. 1 K ILGARD , M., 2009. EXT direct state access. http://www.opengl.org/registry/specs/EXT/direct state access. txt . 5 K ILGARD , M., 2012. NV path rendering. http://www.opengl.org/registry/specs/NV/path rendering.txt . 1 S EGAL , M., AND A KELEY, K. 2012. The OpenGL Graphics Sys- tem: A Specification (Version 4.3 (Compstibility Profile) - August 6, 2012. 1 S TEWART, N., ET AL . The OpenGL extension wrangler library. http://glew.sourceforge.net/ . 6 7