OpenSubdiv.OPENSUBDIV_VERSION.Bfr
OpenSubdiv.OPENSUBDIV_VERSION.Far
OpenSubdiv.OPENSUBDIV_VERSION.Osd
OpenSubdiv.OPENSUBDIV_VERSION.Sdc
OpenSubdiv.OPENSUBDIV_VERSION.Vtr

OpenSubdiv.OPENSUBDIV_VERSION.Far.PatchMap

OpenSubdiv是一个基于CPU和GPU的可扩展的细分曲面库,Far.PatchMap是其中的一个模块,用于管理细分曲面的拓扑关系信息。

模块介绍

Far.PatchMap模块负责将细分曲面的每个局部块映射到最小细分单元。这些局部块通常是三角形或四边形的网格。因此,使用PatchMap后,每个局部块(patch)会被划分为若干个最小的细分单元(subpatch),每个subpatch是细分曲面的不可分割的基本单元。

PatchMap还能帮助我们计算细分曲面上每个顶点的权重,并维护subpatch之间的拓扑关系以及subpatch与局部块之间的映射关系。这些权重和关系信息对于插值计算很重要。

关键参数

  • size:细分曲面总共分成多少个subpatch,决定细度。
  • maxValence:每个subpatch中允许的最大顶点数,超过这个数就需要分裂成多个subpatch。
  • numPtexFaces:暴露给Subdiv算法的图元(element)总数。

成员函数介绍

  • GetRangeTable():获取用于查询subpatch范围的表格。
  • GetNumSubPatches():获取细分曲面中subpatch的个数。
  • GetTotalPatchCount():获取细分曲面总共有多少个patch。
  • GetPatchArray(patchIndex):获取patchIndex索引对应的patch。

使用方法

首先需要创建一个Far.Subdivision对象,该对象的构造函数需要传入一个Far.PatchTable对象和一个Far.PatchMap对象。其中,Far.PatchMap对象可以由以下代码创建:

Far::PatchMap patchMap(*subdivision);

其中,subdivision是Far.Subdivision对象。

创建PatchMap之后,在细分曲面计算过程中,使用以下代码可以获取到subpatch的顶点坐标:

// 获取subpatch数组
const Far::PatchTables::PatchArray & parray = patchMap.GetPatchArray(faceIndex);

// 获取subpatch范围
const Far::Index * cvs = &vertexIndices[parray.vertIndex];
const Far::PatchParam * patch = parray.GetPatchParam(patchIndexInFace);
const Far::Index * cvsInPatch = cvs + patch->vertIndex;
int numTextureUVs = parray.GetDescriptor().GetNumPtexFaces();
const Far::Index *uvIt = parray.GetPatchParamTextureIndices(patchIndexInFace, numTextureUVs);

// 获取subpatch的顶点坐标
...

参考文献