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

OpenSubdiv.OPENSUBDIV_VERSION.Far.PrimvarRefinerReal

OpenSubdiv是一个高性能、开源、跨平台的细分曲面库。Far.PrimvarRefinerReal是OpenSubdiv中的一个实体类,负责对物体的属性进行细分。

功能描述

OpenSubdiv的Far.PrimvarRefinerReal实体类主要实现以下功能:

  1. 对原始物体的属性进行细分。
  2. 利用类似于OpenSubdiv中细分曲面的规则对物体属性进行插值。
  3. 对细分后的属性进行查询和读取。

接口说明

Far.PrimvarRefinerReal类封装了以下常用接口:

void refine(Far::TopologyRefiner& refiner, int level, std::vector<float>& data, int vdatasize)

对物体的属性进行细分。

参数说明:

  • refiner: Far::TopologyRefiner类型,表示细分拓扑结构。
  • level:int类型,表示细分的层数。
  • data:std::vector<float>类型,表示原始物体的属性数据。
  • vdatasize:int类型,表示属性数据在内存中每个元素所占字节数。

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中。

参数说明:

  • level:int类型,表示细分的层数。
  • i_data:std::vector<float>类型,表示原始物体的属性数据。
  • o_data:std::vector<float>类型,表示经过插值后的属性数据,输出参数。
  • i_datasize:int类型,表示输入属性数据在内存中每个元素所占字节数。
  • o_datasize:int类型,表示输出属性数据在内存中每个元素所占字节数。
  • points_only:bool类型,表示是否只对顶点属性进行插值。

void GetRefinedVerticesIndices(int level, Vtr::IndexArray& indices)

获取细分后每个顶点对应的索引值。

参数说明:

  • level:int类型,表示细分的层数。
  • indices:Vtr::IndexArray类型,每个元素表示对应顶点的索引值。

使用示例

#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);

参考链接