我一直在阅读有关如何编写GPU voxelizer的各种文章。根据我的理解,这个过程是这样的:
无视保守的光栅化,我对此过程有很多疑问。
我已经完成渲染每个三角形,选择一个主导轴并正交投影它。正交投影的值应该是多少?它应该是基于体素大小或地图应该覆盖多大面积的某些值吗?
我应该在片段着色器中做什么?如何写入我的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中。
答案 0 :(得分:0)
在我自己的实现中,整个场景被定位并缩放为一个以世界原点为中心的单位立方体。那么modelview-project矩阵很简单。视口只是所需的体素分辨率。
我使用2遍方法输出那些体素片段:第1遍通过使用原子计数器累积单个变量来计算输出体素片段的数量。然后我使用info来分配一个线性缓冲区。
在第二遍中,栅格化的体素片段被存储到分配的线性缓冲区中,使用原子计数器来避免写入冲突。