抱歉,您的浏览器无法访问本站
本页面需要浏览器支持(启用)JavaScript
了解详情 >

Simplygon插件尝鲜

出于性能等考虑,大型项目往往会使用LOD功能,根据相机距离切换模型精度。而海量的3D模型靠人力拆分LOD显然过于昂贵,因此非常有必要使用模型减面工具,所幸业界已经有非常成熟的商业插件,比如InstaLOD和Simplygon,对于个人开发者,Simplygon提供每日200次的免费使用次数,足够用了

安装

环境为Windows系统+支持Vulkan的显卡

  1. 安装VC Redist,这个组件包含了Visual C++的运行时库,VC项目正常运行需要该组件
  2. 安装Vulkan SDK
  3. 下载Simplygon
  4. 选择Free License激活,每个微软账号能有一个Seat,每日200次使用次数
simplygon

第一个项目

以C#控制台实现模型减面为例

  1. Visual Studio创建一个.Net控制台项目

新建CSharp项目

  1. 添加COM依赖,引入转义文件SimplygonDotNetWapper.dll
添加COM依赖

Simplygon依赖

  1. 在项目中添加SimplygonLoader.cs和减面用的模型

Loader位置

添加Loader

  1. 编写代码,实现模型按比例减面
static int Main(string[] args)
{
// 检查是否Load Simplygon
using var sg = Simplygon.Loader.InitSimplygon(out var errorCode, out var errorMessage);
if (errorCode != Simplygon.EErrorCodes.NoError)
{
Console.WriteLine($"Failed to initialize Simplygon: ErrorCode({(int)errorCode}) {errorMessage}");
return (int)errorCode;
}
// 运行减面程序
RunReduction(sg);

return 0;
}
static void RunReduction(Simplygon.ISimplygon sg)
{
// 加载模型/场景
Console.WriteLine("Load scene to process.");
Simplygon.spScene sgScene = LoadScene(sg, "../../../SimplygonMan.obj");

// 初始化
using Simplygon.spReductionProcessor sgReductionProcessor = sg.CreateReductionProcessor();
sgReductionProcessor.SetScene(sgScene);
using Simplygon.spReductionSettings sgReductionSettings = sgReductionProcessor.GetReductionSettings();

// 减面设置
sgReductionSettings.SetReductionTargets(Simplygon.EStopCondition.All, true, false, false, false);
// 三角面变为50%
sgReductionSettings.SetReductionTargetTriangleRatio(0.5f);

// 运行
Console.WriteLine("Start the reduction process.");
sgReductionProcessor.RunProcessing();

// 保存模型,通过修改后缀可以实现导出obj, fbx, usd等类型的模型
Console.WriteLine("Save processed scene.");
SaveScene(sg, sgScene, "Output.obj");

Console.WriteLine("Check log for any warnings or errors.");
CheckLog(sg);
}
static Simplygon.spScene LoadScene(Simplygon.ISimplygon sg, string path)
{
// Create scene importer
using Simplygon.spSceneImporter sgSceneImporter = sg.CreateSceneImporter();
sgSceneImporter.SetImportFilePath(path);

// Run scene importer.
var importResult = sgSceneImporter.Run();
if (Simplygon.Simplygon.Failed(importResult))
{
throw new System.Exception("Failed to load scene.");
}
Simplygon.spScene sgScene = sgSceneImporter.GetScene();
return sgScene;
}

static void SaveScene(Simplygon.ISimplygon sg, Simplygon.spScene sgScene, string path)
{
// Create scene exporter.
using Simplygon.spSceneExporter sgSceneExporter = sg.CreateSceneExporter();
string outputScenePath = string.Join("", new string[] { "output\\", "Reduction", "_", path });
sgSceneExporter.SetExportFilePath(outputScenePath);
sgSceneExporter.SetScene(sgScene);

// Run scene exporter.
var exportResult = sgSceneExporter.Run();
if (Simplygon.Simplygon.Failed(exportResult))
{
throw new System.Exception("Failed to save scene.");
}
}

static void CheckLog(Simplygon.ISimplygon sg)
{
// Check if any errors occurred.
bool hasErrors = sg.ErrorOccurred();
if (hasErrors)
{
Simplygon.spStringArray errors = sg.CreateStringArray();
sg.GetErrorMessages(errors);
var errorCount = errors.GetItemCount();
if (errorCount > 0)
{
Console.WriteLine("Errors:");
for (uint errorIndex = 0; errorIndex < errorCount; ++errorIndex)
{
string errorString = errors.GetItem((int)errorIndex);
Console.WriteLine(errorString);
}
sg.ClearErrorMessages();
}
}
else
{
Console.WriteLine("No errors.");
}

// Check if any warnings occurred.
bool hasWarnings = sg.WarningOccurred();
if (hasWarnings)
{
Simplygon.spStringArray warnings = sg.CreateStringArray();
sg.GetWarningMessages(warnings);
var warningCount = warnings.GetItemCount();
if (warningCount > 0)
{
Console.WriteLine("Warnings:");
for (uint warningIndex = 0; warningIndex < warningCount; ++warningIndex)
{
string warningString = warnings.GetItem((int)warningIndex);
Console.WriteLine(warningString);
}
sg.ClearWarningMessages();
}
}
else
{
Console.WriteLine("No warnings.");
}

// Error out if Simplygon has errors.
if (hasErrors)
{
throw new System.Exception("Processing failed with an error");
}
}
  1. 运行,检查减面效果

减面前:

减面前

50%减面

减面后

10%减面

减面10

能看出三角面和顶点数按比例减少了

在使用过程中,发现相同精度的模型,fbx顶点数比obj小,是两者顶点buffer组织的差异导致的吗?还是Win11自带的模型预览器统计方式有问题

其他功能

Simplygon还提供了许多功能,除了基础的静态模型减面生成LOD外,还支持人物模型LOD(保留权重),骨骼缩减,远景、树草替代物生成(如Billboard),遮蔽物减面,详情可以参考官方文档,这里仅抛砖引玉

评论