OpenSubdiv是一个基于CPU和GPU的可扩展的细分曲面库,Far.PatchMap是其中的一个模块,用于管理细分曲面的拓扑关系信息。
Far.PatchMap模块负责将细分曲面的每个局部块映射到最小细分单元。这些局部块通常是三角形或四边形的网格。因此,使用PatchMap后,每个局部块(patch)会被划分为若干个最小的细分单元(subpatch),每个subpatch是细分曲面的不可分割的基本单元。
PatchMap还能帮助我们计算细分曲面上每个顶点的权重,并维护subpatch之间的拓扑关系以及subpatch与局部块之间的映射关系。这些权重和关系信息对于插值计算很重要。
首先需要创建一个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的顶点坐标
...