如何开始使用GPU voxelizer?

时间:2015-06-29 19:29:03

标签: c++ opengl gpgpu voxel

我一直在阅读有关如何编写GPU voxelizer的各种文章。根据我的理解,这个过程是这样的:

  1. 单独检查三角形并确定以最大方式显示三角形的轴。将此称为主导轴。
  2. 在其主轴上渲染三角形并对出来的纹素进行采样。
  3. 将该纹素数据写入3D纹理,然后使用数据执行操作
  4. 无视保守的光栅化,我对此过程有很多疑问。

    我已经完成渲染每个三角形,选择一个主导轴并正交投影它。正交投影的值应该是多少?它应该是基于体素大小或地图应该覆盖多大面积的某些值吗?

    我应该在片段着色器中做什么?如何写入我的3D纹理以便存储体素数据?根据我的理解,由于选择了主轴,我们不能为每个片段提供超过1个体素的深度。但是,由于我们正交投影,我看不出它会如何反映到3D纹理上。

    最后,我想知道在哪里存储纹理数据。我知道存储数据CPU方面是一个坏主意,因为你必须将它全部传递到GPU上使用它,但是我跟随的源代码选择将所有纹理存储在CPU端,例如那些用于光照贴图。我的假设是,只应在GPU上使用的数据应该存储在那里,并且两者上使用的数据应该存储在CPU方面。因此,我将数据存储在CPU端。这是对的吗?

    我的主要消息来源是:https://www.seas.upenn.edu/~pcozzi/OpenGLInsights/OpenGLInsights-SparseVoxelization.pdf OpenGL Insights https://github.com/otaku690/sparsevoxeloctree使用voxelizer的SVO。问题是着色器代码不在github中。

1 个答案:

答案 0 :(得分:0)

在我自己的实现中,整个场景被定位并缩放为一个以世界原点为中心的单位立方体。那么modelview-project矩阵很简单。视口只是所需的体素分辨率。

我使用2遍方法输出那些体素片段:第1遍通过使用原子计数器累积单个变量来计算输出体素片段的数量。然后我使用info来分配一个线性缓冲区。

在第二遍中,栅格化的体素片段被存储到分配的线性缓冲区中,使用原子计数器来避免写入冲突。