【问题标题】:How to render volume data into a 3D texture using OpenGL?如何使用 OpenGL 将体积数据渲染成 3D 纹理?
【发布时间】:2016-01-01 02:43:27
【问题描述】:

我正在尝试使用 GPU 将一些 3D 形状渲染为 3D 纹理。我正在使用 Framebuffer 对象来完成此操作。到目前为止,我发现唯一可行的方法是一次渲染到 3D 纹理的一个切片(或层)。

例如,如果我想在 3D 纹理上绘制一个球体,我会将球体的适当横截面绘制到纹理的每一层。

这适用于小分辨率或少量形状,但随着分辨率或复杂性的增加会迅速减慢。

有没有更正确或更快的方法?我的目标是中等老旧的硬件,所以我仅限于 OpenGL 3.x。具体来说,我不能使用一些the techniques described here。

【问题讨论】:

  • 看来,在可用的情况下,在片段着色器中使用imageStore 是正确的答案。我可以简单地将形状渲染到一个平面(比方说 xy 平面),而不是为体积的每个切片绘制我的形状的横截面,然后对于每个“片段”,我可以计算我的形状的 z 间隔并且只需imageStore 3D 纹理中的正确坐标。如何在不允许此类控制的硬件上有效执行此操作的问题仍然悬而未决。

标签: c++ opengl 3d volume voxel


【解决方案1】:

虽然我没有亲自这样做过,但我知道有一个针对 directX 的解决方案的示例。它可以移植到 OpenGL:Generating Complex Procedural Terrains Using the GPU,请参阅第 1.3.2 节:生成密度值。

简而言之,进行实例化绘制,并将每个实例指向纹理的不同层。

您还可以复制所有三角形并使用几何着色器将它们发送到所有相关切片。

【讨论】:

  • 好建议,但这似乎调用片段着色器的次数与我的方法相同(尽管由于绘制调用更少,它可能更有效)。现在,我决定在 OpenGL 4.2 中尝试使用 imageStore。
  • 您可以将我最初的想法与剪辑平面结合起来,在片段着色器运行之前丢弃不需要的片段。这在 HLSL 中是可能的(所以我假设 GLSL 也支持它)并且通常与早期深度测试同时发生(作为选择要着色的片段的一部分)。
猜你喜欢
  • 1970-01-01
  • 2023-04-10
  • 2012-03-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-12-27
相关资源
最近更新 更多