OpenSubdiv是一个高性能、开源、跨平台的细分曲面库。Far.PrimvarRefinerReal是OpenSubdiv中的一个实体类,负责对物体的属性进行细分。
OpenSubdiv的Far.PrimvarRefinerReal实体类主要实现以下功能:
Far.PrimvarRefinerReal类封装了以下常用接口:
void refine(Far::TopologyRefiner& refiner, int level, std::vector<float>& data, int vdatasize)
对物体的属性进行细分。
参数说明:
void interpolate(int level, std::vector<float>&i_data, std::vector<float>&o_data, int i_datasize, int o_datasize, bool points_only)
利用细分拓扑结构对属性进行插值,并将结果存储在o_data中。
参数说明:
void GetRefinedVerticesIndices(int level, Vtr::IndexArray& indices)
获取细分后每个顶点对应的索引值。
参数说明:
#include <vector>
#include <opensubdiv/far/topologyRefiner.h>
#include <opensubdiv/far/primvarRefiner.h>
#include <opensubdiv/far/primvarRefinerCrease.h>
#include <Vtr/types.h>
OpenSubdiv::Far::TopologyRefiner topologyRefiner(farMesh);
std::vector<float> positions(datasize * nverts);
float* data = (float*)&positions[0];
OpenSubdiv::Far::PrimvarRefinerFactory<OpenSubdiv::Far::PrimvarRefinerReal> primvarRefinerFactory(topologyRefiner);
OpenSubdiv::Far::PrimvarRefinerReal& primvarRefiner = primvarRefinerFactory.Create(data, nverts, datasize);
primvarRefiner.refine(topologyRefiner, level, positions, datasize);
std::vector<float> refinedPositions(positions.size() * 4, 0);
primvarRefiner.interpolate(level, positions, refinedPositions, datasize, 4, true);
Vtr::IndexArray refinedIndices;
primvarRefiner.GetRefinedVerticesIndices(level, refinedIndices);