OpenSubdiv.OPENSUBDIV_VERSION.Far.StencilReal
实现了用于计算远程顶点的可用于高效光栅化的精细级别的 stencil 模板。
其主要用于 FarPatchTables
中的纹理和着色器着色笔刷的使用,并可以用于 PatchTableFactory
创建时指定的不相交分区。
IndexType
是 stencil 模板中数组的索引类型。这可以是有符号或无符号整数类型。
WeightType
是 stencil 模板中每个远程顶点权重的类型。这可以是 float 或 double 类型。
ValueType
是 stencil 模板中远程顶点的类型。这可以是 float2、float3、float4、double2、double3 和 double4 类型。
StencilTable
包含一个指向远程顶点的指针数组以及一个权重数组。这两个数组必须被分类为 supported vertex types 和一个 label。
这些成员变量是目标数据存储区的偏移量、索引和权重。它们可以是相同的长度,也可以是不同的长度。
void SetSize(IndexType numStencils, IndexType numControlVertices, IndexType const * sizes);
设置 stencil 表的大小和形状。
numStencils
是 stencil 数组中的元素数。
numControlVertices
是一组控制顶点的数量。
sizes
是每个 stencil 的长度。
void UpdateValues(ValueType const * values, IndexType const * indices);
更新 stencil 表中的源数据。
values
是用于确定 stencil 表的源数据的数组。
indices
是每个 stencil 索引值的序列。
void UpdateWeights(WeightType const * weights);
更新权重数组。
weights
是 stencil 表中权重的数组。
IndexType GetNumStencils() const;
返回 stencil 数组的大小。
IndexType GetSize(IndexType indx) const;
返回指定 stencil 的大小。
IndexType const * GetIndex(IndexType stencilIndex) const;
返回指定 stencil 的索引。
WeightType const * GetWeight(IndexType stencilIndex) const;
返回指定 stencil 的权重。
// 创建 stencil table
OpenSubdiv::Far::StencilTable stencil;
stencil.SetSize(numStencils, numControlVertices, &sizes[0]);
// 更新 stencil table 数据
stencil.UpdateValues(&values[0], &indices[0]);
stencil.UpdateWeights(&weights[0]);
// 获取 stencil table 数据
const OpenSubdiv::Far::IndexType stencilSize = stencil.GetSize(stencilIndex);
const OpenSubdiv::Far::IndexType * stencilIndices = stencil.GetIndex(stencilIndex);
const float * stencilWeights = stencil.GetWeight(stencilIndex);
在使用 stencil 表时,可能会出现以下异常:
std::runtime_error
:如果板之间相交,则会导致此异常。