代码之家  ›  专栏  ›  技术社区  ›  SmacL

使用GPU、Direct3D或OpenGL自定义渲染

  •  0
  • SmacL  · 技术社区  · 6 年前

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

    编辑: 澄清一点,目前我有以下几点;

    1. 内存中的显示列表/场景,通常包含几百万个三角形、线条和文本片段, 我在软件中挑选,并输出到位图使用低性能的绘图原语

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

    3. 输出前添加到位图的光标信息

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

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

    或者,我可以移动到一个基于场景的框架,它可以为我管理相机和导航,并以球体或其他形式提供视点 splats 基于渲染循环期间的体积和细节级别。在这个场景中,我还需要能够将光标信息添加到视图中。

    在任何一种情况下,托管应用程序都是基于VS2017的MFC C++,为了实现这个目的,这将需要太多的工作来改变。

    1 回复  |  直到 6 年前
        1
  •  1
  •   XenonofArcticus    6 年前

    根据你对复杂问题的描述很难说清楚。

    OSG可能会做你想做的事。

    根据您的时间安排,我会考虑避开OpenGL(OSG)和DirectX,转而使用更新的vulkan3dapi。它是D3D和OGL的继承者,由GPU制造商自己设计,以提供超越两个前辈的最佳性能。

    OSG项目目前正在开发一个名为VSG的Vulkan场景图,它已经证明了比OSG优越的性能,并且将具有更广泛的剔除能力。

    我在点云方面做过很多工作,对它们很有经验,但我不太清楚你打算做什么。

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