OpenSubdiv是一个高性能、面向细节的Subdivision表面细化库,可以用于各种图形应用程序。其中,Osd.TbbEvaluator是OpenSubdiv库中的一个TBB线程池表面求值器,用于在多线程环境下对曲面进行求值。
Osd.TbbEvaluator实现了Subdivision表面细化算法,可以将初始曲面细化为更精细的曲面。该求值器支持Bezier、BSpline和Catmull-Clark曲线类型,可以自定义曲线的边界条件和细化规则。同时,Osd.TbbEvaluator利用了TBB线程池技术,可以在多核CPU上高效地进行曲面求值,并且可以根据硬件资源和曲面特性自动调整线程池大小和分配策略。
Osd.TbbEvaluator提供了以下公共接口:
Osd::TbbEvaluator::TbbEvaluator(const Far::PatchTable* patchTable,
const Far::LimitStencilTable* limitTable,
const Far::PatchParamTable* patchParamTable,
int numThreads=0,
bool doQuad=false);
该构造函数用于创建一个TBB线程池表面求值器。其中,参数patchTable、limitTable和patchParamTable是Subdivision库中的数据结构,用于存储曲面的拓扑结构、控制点、限制点和曲面类型等信息。numThreads参数用于指定线程池的大小,如果为0则使用硬件线程数。doQuad参数表示是否对四边形曲面进行细化。
void Osd::TbbEvaluator::EvalStencils(Far::PatchTable const & patchTable,
Far::StencilTable const & vertexStencils,
float const * vertexValues,
int numValues,
int const * vertexIndices,
float * results,
int numResults,
int start=0, int end=-1) const;
该函数用于对曲面进行求值。参数patchTable、vertexStencils、vertexValues和vertexIndices是Subdivision库中的数据结构,用于描述曲面的细分信息和控制点信息。numValues参数表示细分后的顶点数量,results数组用于存储求值后的顶点位置和法线等信息,numResults参数表示result数组的大小。start和end参数用于指定要求值的顶点范围,如果end为-1则代表到最后一个顶点。
以下示例展示了如何使用Osd.TbbEvaluator对曲面进行求值。
#include <osd/tbbEvaluator.h>
Osd::TbbEvaluator evaluator(patchTable, limitTable, paramTable);
// 求值所有顶点
evaluator.EvalStencils(patchTable, vertexStencils, vertexValues,
numVertices, vertexIndices,
results, numResults);
// 求值部分顶点
evaluator.EvalStencils(patchTable, vertexStencils, vertexValues,
numVertices, vertexIndices,
results, numResults, start, end);
Osd.TbbEvaluator是OpenSubdiv库中的一个TBB线程池表面求值器,可以在多线程环境下高效地对曲面进行求值。该求值器支持Bezier、BSpline和Catmull-Clark曲线类型,可以自定义曲线的边界条件和细化规则,并且可以根据硬件资源和曲面特性自动调整线程池大小和分配策略。