1RTC_GEOMETRY_TYPE_SUBDIVISEImObNr(e3e)Ray Tracing KerRnTeCl_sGE4OMETRY_TYPE_SUBDIVISION(3)
2
3
4
5 NAME
6 RTC_GEOMETRY_TYPE_SUBDIVISION - subdivision geometry type
7
8 SYNOPSIS
9 #include <embree4/rtcore.h>
10
11 RTCGeometry geometry =
12 rtcNewGeometry(device, RTC_GEOMETRY_TYPE_SUBDIVISION);
13
14 DESCRIPTION
15 Catmull-Clark subdivision meshes are supported, including support for
16 edge creases, vertex creases, holes, non-manifold geometry, and face-
17 varying interpolation. The number of vertices per face can be in the
18 range of 3 to 15 vertices (triangles, quadrilateral, pentagons, etc).
19
20 Subdivision meshes are created by passing RTC_GEOMETRY_TYPE_SUBDIVISION
21 to the rtcNewGeometry function. Various buffers need to be set by the
22 application to set up the subdivision mesh. See rtcSetGeometryBuffer
23 and rtcSetSharedGeometryBuffer for more details on how to set buffers.
24 The face buffer (RTC_BUFFER_TYPE_FACE type and RTC_FORMAT_UINT format)
25 contains the number of edges/indices of each face (3 to 15), and the
26 number of faces is inferred from the size of this buffer. The index
27 buffer (RTC_BUFFER_TYPE_INDEX type) contains multiple (3 to 15) 32-bit
28 vertex indices (RTC_FORMAT_UINT format) for each face, and the number
29 of edges is inferred from the size of this buffer. The vertex buffer
30 (RTC_BUFFER_TYPE_VERTEX type) stores an array of single precision x, y,
31 z floating point coordinates (RTC_FORMAT_FLOAT3 format), and the number
32 of vertices is inferred from the size of this buffer.
33
34 Optionally, the application may set additional index buffers using dif‐
35 ferent buffer slots if multiple topologies are required for face-vary‐
36 ing interpolation. The standard vertex buffers (RTC_BUFFER_TYPE_VER‐
37 TEX) are always bound to the geometry topology (topology 0) thus use
38 RTC_BUFFER_TYPE_INDEX with buffer slot 0. User vertex data interpola‐
39 tion may use different topologies as described later.
40
41 Optionally, the application can set up the hole buffer (RTC_BUF‐
42 FER_TYPE_HOLE) which contains an array of 32-bit indices (RTC_FOR‐
43 MAT_UINT format) of faces that should be considered non-existing in all
44 topologies. The number of holes is inferred from the size of this buf‐
45 fer.
46
47 Optionally, the application can fill the level buffer (RTC_BUF‐
48 FER_TYPE_LEVEL) with a tessellation rate for each of the edges of each
49 face. This buffer must have the same size as the index buffer. The
50 tessellation level is a positive floating point value (RTC_FORMAT_FLOAT
51 format) that specifies how many quads along the edge should be generat‐
52 ed during tessellation. If no level buffer is specified, a level of 1
53 is used. The maximally supported edge level is 4096, and larger levels
54 are clamped to that value. Note that edges may be shared between (typ‐
55 ically 2) faces. To guarantee a watertight tessellation, the level of
56 these shared edges should be identical. A uniform tessellation rate
57 for an entire subdivision mesh can be set by using the rtcSetGeome‐
58 tryTessellationRate function. The existence of a level buffer has
59 precedence over the uniform tessellation rate.
60
61 Optionally, the application can fill the sparse edge crease buffers to
62 make edges appear sharper. The edge crease index buffer (RTC_BUF‐
63 FER_TYPE_EDGE_CREASE_INDEX) contains an array of pairs of 32-bit vertex
64 indices (RTC_FORMAT_UINT2 format) that specify unoriented edges in the
65 geometry topology. The edge crease weight buffer (RTC_BUF‐
66 FER_TYPE_EDGE_CREASE_WEIGHT) stores for each of these crease edges a
67 positive floating point weight (RTC_FORMAT_FLOAT format). The number
68 of edge creases is inferred from the size of these buffers, which has
69 to be identical. The larger a weight, the sharper the edge. Specify‐
70 ing a weight of infinity is supported and marks an edge as infinitely
71 sharp. Storing an edge multiple times with the same crease weight is
72 allowed, but has lower performance. Storing an edge multiple times
73 with different crease weights results in undefined behavior. For a
74 stored edge (i,j), the reverse direction edges (j,i) do not have to be
75 stored, as both are considered the same unoriented edge. Edge crease
76 features are shared between all topologies.
77
78 Optionally, the application can fill the sparse vertex crease buffers
79 to make vertices appear sharper. The vertex crease index buffer
80 (RTC_BUFFER_TYPE_VERTEX_CREASE_INDEX), contains an array of 32-bit ver‐
81 tex indices (RTC_FORMAT_UINT format) to specify a set of vertices from
82 the geometry topology. The vertex crease weight buffer (RTC_BUF‐
83 FER_TYPE_VERTEX_CREASE_WEIGHT) specifies for each of these vertices a
84 positive floating point weight (RTC_FORMAT_FLOAT format). The number
85 of vertex creases is inferred from the size of these buffers, and has
86 to be identical. The larger a weight, the sharper the vertex. Speci‐
87 fying a weight of infinity is supported and makes the vertex infinitely
88 sharp. Storing a vertex multiple times with the same crease weight is
89 allowed, but has lower performance. Storing a vertex multiple times
90 with different crease weights results in undefined behavior. Vertex
91 crease features are shared between all topologies.
92
93 Subdivision modes can be used to force linear interpolation for parts
94 of the subdivision mesh; see rtcSetGeometrySubdivisionMode for more de‐
95 tails.
96
97 For multi-segment motion blur, the number of time steps must be first
98 specified using the rtcSetGeometryTimeStepCount call. Then a vertex
99 buffer for each time step can be set using different buffer slots, and
100 all these buffers have to have the same stride and size.
101
102 Also see tutorial [Subdivision Geometry] for an example of how to cre‐
103 ate subdivision surfaces.
104
105 Parametrization
106 The parametrization for subdivision faces is different for quadrilater‐
107 als and non-quadrilateral faces.
108
109 The parametrization of a quadrilateral face uses the first vertex p0 as
110 base point, and the vector p1 - p0 as u-direction and p3 - p0 as v-di‐
111 rection.
112
113 The parametrization for all other face types (with number of vertices
114 not equal 4), have a special parametrization where the subpatch ID n
115 (of the n-th quadrilateral that would be obtained by a single subdivi‐
116 sion step) and the local hit location inside this quadrilateral are en‐
117 coded in the UV coordinates. The following code extracts the sub-patch
118 ID i and local UVs of this subpatch:
119
120 unsigned int l = floorf(0.5f*U);
121 unsigned int h = floorf(0.5f*V);
122 unsigned int i = 4*h+l;
123 float u = 2.0f*fracf(0.5f*U)-0.5f;
124 float v = 2.0f*fracf(0.5f*V)-0.5f;
125
126 This encoding allows local subpatch UVs to be in the range [-0.5,1.5[
127 thus negative subpatch UVs can be passed to rtcInterpolate to sample
128 subpatches slightly out of bounds. This can be useful to calculate de‐
129 rivatives using finite differences if required. The encoding further
130 has the property that one can just move the value u (or v) on a sub‐
131 patch by adding du (or dv) to the special UV encoding as long as it
132 does not fall out of the [-0.5,1.5[ range.
133
134 To smoothly interpolate vertex attributes over the subdivision surface
135 we recommend using the rtcInterpolate function, which will apply the
136 standard subdivision rules for interpolation and automatically takes
137 care of the special UV encoding for non-quadrilaterals.
138
139 Face-Varying Data
140 Face-varying interpolation is supported through multiple topologies per
141 subdivision mesh and binding such topologies to vertex attribute buf‐
142 fers to interpolate. This way, texture coordinates may use a different
143 topology with additional boundaries to construct separate UV regions
144 inside one subdivision mesh.
145
146 Each such topology i has a separate index buffer (specified using
147 RTC_BUFFER_TYPE_INDEX with buffer slot i) and separate subdivision mode
148 that can be set using rtcSetGeometrySubdivisionMode. A vertex attri‐
149 bute buffer RTC_BUFFER_TYPE_VERTEX_ATTRIBUTE bound to a buffer slot j
150 can be assigned to use a topology for interpolation using the rtcSetGe‐
151 ometryVertexAttributeTopology call.
152
153 The face buffer (RTC_BUFFER_TYPE_FACE type) is shared between all
154 topologies, which means that the n-th primitive always has the same
155 number of vertices (e.g. being a triangle or a quad) for each topology.
156 However, the indices of the topologies themselves may be different.
157
158 EXIT STATUS
159 On failure NULL is returned and an error code is set that can be
160 queried using rtcGetDeviceError.
161
162 SEE ALSO
163 [rtcNewGeometry]
164
165
166
167 RTC_GEOMETRY_TYPE_SUBDIVISION(3)