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)
Impressum