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

OpenSubdiv开发手册

OpenSubdiv是一种高性能的Subdivision Surface细分曲面库,它使用CUDA、OpenCL和CPU多线程等技术实现了快速、可扩展和高质量的Subdivision Surface细分曲面计算。以下是OpenSubdiv的开发文档,包括安装、使用和示例等方面的内容。

安装

可以从OpenSubdiv的GitHub仓库中获取源代码,然后使用CMake构建和安装OpenSubdiv库。以下是具体的步骤:

  1. 获取源代码

可以从OpenSubdiv的GitHub仓库中获取源代码。在命令行中输入以下命令:

git clone https://github.com/PixarAnimationStudios/OpenSubdiv.git
  1. 构建和安装

可以使用CMake构建和安装OpenSubdiv库。在命令行中输入以下命令:

mkdir build
cd build
cmake ../OpenSubdiv -DNO_EXAMPLES=1 -DNO_TUTORIALS=1
make
sudo make install

这将会构建和安装OpenSubdiv库,并将头文件和库文件安装到系统的默认路径中。

使用

以下是使用OpenSubdiv库进行Subdivision Surface细分曲面计算的一些基本步骤:

  1. 定义网格数据

首先,需要定义网格数据,包括顶点位置、拓扑结构和边界等信息。可以使用OpenSubdiv提供的Mesh接口或自定义的网格类来存储和管理网格数据。

struct MyMesh {
  std::vector<float> vertices; // 顶点坐标
  std::vector<int> indices;    // 三角面片索引
  std::vector<int> sizes;      // 三角面片大小
  std::vector<int> offsets;    // 三角面片偏移量
};
  1. 创建TopologyRefiner

使用OpenSubdiv的Far模块进行Subdivision Surface细分曲面计算和渲染的第一步是创建TopologyRefiner对象。可以使用以下代码创建TopologyRefiner对象:

OpenSubdiv::Far::TopologyRefiner* refiner = OpenSubdiv::Far::TopologyRefinerFactory<MyMesh>::Create(myMesh, OpenSubdiv::Sdc::TYPE_CATMARK);

其中,myMesh是自定义的网格类对象,OpenSubdiv::Sdc::TYPE_CATMARK是Subdivision Surface细分曲面的类型。可以根据需要选择其他的Subdivision Surface细分曲面类型。

  1. 计算细分曲面

可以使用以下代码来计算Subdivision Surface细分曲面:

refiner->RefineUniform(OpenSubdiv::Far::TopologyRefiner::UniformOptions(level));

其中,level是Subdivision Surface细分曲面的细分级别。可以根据需要选择适当的细分级别。

  1. 获取细分曲面数据

可以使用以下代码获取Subdivision Surface细分曲面的数据:

const OpenSubdiv::Far::TopologyRefiner* refiner = OpenSubdiv::Far::TopologyRefinerFactory<MyMesh>::Create(myMesh, OpenSubdiv::Sdc::TYPE_CATMARK);
Level& level = refiner->GetLevel(levelIndex);
const OpenSubdiv::Far::StencilTable* stencilTable = level.GetStencilTable();
const OpenSubdiv::Far::LimitStencilTable* limitStencilTable = level.GetLimitStencilTable();
const OpenSubdiv::Far::PatchTable* patchTable = level.GetPatchTable();

其中,levelIndex是细分曲面的级别。可以根据需要来替换。

  1. 渲染细分曲面

最后,可以使用以上步骤获取到的Subdivision Surface细分曲面的数据进行渲染。具体的渲染方法取决于使用的渲染引擎或API,但一般需要将细分曲面的数据转换为渲染引擎或API所需的格式,例如顶点和索引缓冲区。

示例

以下是一个使用OpenSubdiv库进行Subdivision Surface细分曲面计算和渲染的示例程序:

#include <opensubdiv/far/topologyRefinerFactory.h>

struct MyMesh {
  std::vector<float> vertices;
  std::vector<int> indices;
  std::vector<int> sizes;
  std::vector<int> offsets;
};

void computeSubdiv(MyMesh& mesh, int level) {
  // 创建TopologyRefiner
  OpenSubdiv::Far::TopologyRefiner* refiner = OpenSubdiv::Far::TopologyRefinerFactory<MyMesh>::Create(mesh, OpenSubdiv::Sdc::TYPE_CATMARK);

  // 计算细分曲面
  refiner->RefineUniform(OpenSubdiv::Far::TopologyRefiner::UniformOptions(level));

  // 获取细分曲面数据
  OpenSubdiv::Far::TopologyRefiner::Level& levelData = refiner->GetLevel(level);
  const OpenSubdiv::Far::StencilTable* stencilTable = levelData.GetStencilTable();
  const OpenSubdiv::Far::LimitStencilTable* limitStencilTable = levelData.GetLimitStencilTable();
  const OpenSubdiv::Far::PatchTable* patchTable = levelData.GetPatchTable();

  // 渲染细分曲面
  // ...
}

这个示例程序定义了一个MyMesh类,用于存储网格数据。然后,它创建了一个TopologyRefiner对象,并使用RefineUniform函数计算Subdivision Surface细分曲面。最后,它获取细分曲面的数据,并使用渲染引擎或API进行渲染。

总之,OpenSubdiv是一个功能强大的Subdivision Surface细分曲面库,可以用于创建高质量、可扩展和高性能的Subdivision Surface细分曲面应用程序。通过使用上述步骤和示例代码,开发人员可以快速入门和使用OpenSubdiv库。