在C ++ / DirectX11中将“经理”样式类转换为自由函数

时间:2019-04-01 22:48:17

标签: c++ directx-11

我最近在使用DX11 / C ++的一些代码中遇到了一个设计问题。我正在构建一个小的体素编辑器,到目前为止一切正常,但是我的一些代码存在一些设计问题。

目前,我在组织计算着色器时遇到麻烦。有各种针对单个问题的计算着色器。例如:一些在体素中绘制新块,另一些对体素进行平滑处理,另一些实现行进立方体以创建体素网格,等等,等等。这是让我质疑大量设计的代码段:

auto voxelInput = voxel::sphere(width, height, depth, center, radius);

auto kernel = voxel::kernel::separable::average(9);
auto smoother = voxel::kernel::processor();

smoother.apply(voxelInput, kernel); 

auto build = marchingCubes::builder<mesh::triangle<vertex::light>, vertex::light>();

return build.mesh(voxelInput, radius/2.f, v3::Zero());

我遇到的具体问题是marchingCubes :: builder和voxel :: kernel :: processor类。我知道这些是错误的,它们所做的只是编译并保存指向着色器代码的指针。我认为应该将它们转换为自由函数,并像这样调用:

voxel::kernel::apply(voxelInput, kernel);

return marchingCubes::mesh(voxelInput, radius/2.f, v3::Zero());

我知道可以解决此问题的几种方法:

1)每次调用任何一个函数时,我都会编译必要的着色器(这是最简单的方法,它将使我得到最终结果,但是最丑陋,并且需要频繁地编译/删除着色器,尤其是当我批处理一堆时一次执行体素操作)。

2)使用单例在函数顶部创建类。我不再每次都重新编译,但是现在我失去了轻松删除对象的能力。当我想加载另一个完全不使用任何体素功能的完全不同的模块时,会发生什么?如果我继续加载这样的模块,那么我可能会在我不再使用的内存中漂浮大量无意义的着色器。

3)创建具有所有内置功能的体素类。调用voxel.applyKernel(krnl),voxel.paint(position),voxel.mesh(args)等。我不喜欢这样,因为我恐怕这会使我的体素班变得肿并且乏味。我可能必须在所有体素之间将一个shared_ptr存储到着色器。这解决了我的内存问题,但创建了一个具有整体式omni类的新设计问题。

4)在我的引擎中更高级别的某种计算着色器管理器。它的行为就像一个单例,但是当卸载体素模块时,我可能会回叫它以删除着色器。我获得了免费功能,并可以在需要时删除着色器。添加更多功能(例如绘画者)将更加容易。有一些问题,例如有人在破坏模块时忘记删除着色器。或有人要求删除,但仍有另一个模块使用免费功能。最后一个可能可以用某种引用计数器/智能指针解决,但我不确定这是否正确。可能需要做很多工作,我想我只是将问题转移到了其他地方。

5)保留相同的类样式,但是在创建体素模块时将其初始化。这是最简单,最简单的方法,但是我仍然剩下这些怪异的类。我所做的就是再次解决问题。这样发生错误的机会较小,但是如果另一个模块使用某些功能(应该是少量),则可能会重复着色器代码。

以上所有选项在技术上均有效,但没有一个是正确的。我想知道是否有人有一个我没有考虑过的更好的选择?

0 个答案:

没有答案