使用GPU,Direct3D或OpenGL进行自定义渲染

时间:2019-01-30 17:45:10

标签: rendering direct3d openscenegraph

我有一个Windows应用程序,该应用程序当前主要使用MFC渲染图形,我想对其进行更改以更好地利用GPU。大多数图形很简单,可以很容易地构建为场景图,但是有些图形可能非常困难。具体来说,除了普通的网格类型对象外,我还处理点云,这些点云可能包含以非常紧凑的方式存储的数十亿笛卡尔坐标,这些点云使用了大量的自定义剔除技术进行实时显示({ {3}})。我要寻找的是一种将大部分场景渲染到缓冲区的机制,然后使我可以访问该缓冲区,z缓冲区和相机参数,这样我就可以在将它们发布到显示器之前对其进行修改。我想知道Direct3D,OpenGL是否可能,或者是否可以使用像OpenSceneGraph这样的高级框架,最佳的起点是什么?鉴于该软件基于Windows,我可能更喜欢使用Direct3D,因为这可能会导致最少的驱动程序问题,我很想避免。 OpenSceneGraph似乎可以通过八叉树提供自定义剔除,这些八叉树与我使用的八叉树接近但不完全相同。

编辑:为了进一步说明,目前我有以下内容;

  1. 内存中的显示列表/场景,通常包含多达几百万个三角形,线条和文本片段,我用软件将其剔除并使用性能欠佳的绘图图元输出到位图< / strong>

  2. 内存中的点云,可能包含数十亿个高度压缩格式的点(每3d点约4.5字节),我将其剔除并输出到相同的位图

  3. 在输出之前已添加到位图中的光标信息

  4. 用于导航和拾取目的的摄影机,z缓冲区和属性缓冲区

慢速位是第1部分的突出显示部分,我想用某种GPU渲染代替。我设想的解决方案是为GPU构建一个场景,根据我当前的相机参数将其渲染为位图(具有匹配的z缓冲区),然后在输出之前添加点云。

或者,我可以转到一个基于场景的框架,该框架为我管理摄像机和导航,并在渲染循环中根据体积和细节级别将视点提供为球形或Example。在这种情况下,我还需要能够将光标信息添加到视图中。

在任何一种情况下,托管应用程序都是基于VS2017的MFC C ++,为此目的,该工作需要太多工作才能更改。

1 个答案:

答案 0 :(得分:1)

很难根据您对一个复杂问题的描述确切地说。

OSG可以满足您的需求。

根据您的时间框架,我会考虑避开OpenGL(OSG)和DirectX,而采用更新的Vulkan 3D API。它是D3D和OGL的后继产品,由GPU制造商自行设计,以提供超越其前任产品的最佳性能。

OSG项目目前正在开发称为VSG的Vulkan场景图,该场景图已经表现出优于OSG的性能,并将具有更广泛的剔除能力。

我在处理点云方面做了大量工作,并且对它们有相当的经验,但是我对您打算做的事情并不清楚。

如果您想就此事进行口头讨论,我很容易找到(我的公司是AlphaPixel-AlphaPixel.com),您可以致电给我们。我现在在欧洲时区,您的问题目前还不清楚,但您听起来是美国人。