【问题标题】:OpenGL - how to render object to 3D texture as a volumetric billboardOpenGL - 如何将对象渲染为 3D 纹理作为体积广告牌
【发布时间】:2023-04-10 17:11:02
【问题描述】:

我正在尝试在 OpenGL 3.3+ 中实现体积广告牌,如 here 所述 和视频here。 我现在面临的问题(非常基本)是:如何有效地将 3D 对象渲染为 3D 纹理(如论文中所述)?假设对象可以存储在 256x256x128 tex 中创建 256*256*128*2 帧缓冲区(因为据说它应该在每个轴上渲染两次:+X,-X,+Y,-Y,+Z,-Z)会很疯狂,并且纹理单元太少而无法处理那么多纹理据我所知(更不用说所需的时间)。

有人知道如何处理这样的事情吗?

【问题讨论】:

  • 我怀疑 OpenGL 是否可行,那里有体素化算法我认为你应该挖掘它们。
  • 你认为你为什么需要这么多帧缓冲?它只是 256*2 + 256*2 + 128*2
  • 问题是我必须在 OpenGL 中进行,我在大学的计算机图形课程中使用 OGL。我会努力去做的,如果我有什么成就我会告诉你的。关于帧缓冲区:对不起,你是对的,我的错。传递给着色器 afaik 仍然太多(纹理单元的数量是瓶颈)
  • 如果你找到可以很好并行的方法,你可以使用计算着色器。

标签: opengl 3d-texture


【解决方案1】:

一片 3D 纹理可以直接附加到当前帧缓冲区。因此,创建一个帧缓冲区、一个 3D 纹理,然后进行如下渲染:

glFramebufferTexture3D( GL_FRAMEBUFFER, Attachment, GL_TEXTURE_3D,
                        TextureID, 0, ZSlice );
...render to the slice of 3D texture...

因此,您只需要 1 个帧缓冲区,它将根据目标 3D 纹理中 Z 切片的数量进行迭代。

【讨论】:

  • 那么,这是否意味着您必须对每个切片进行一次绘制?无法一次性渲染整个 3D 纹理?
  • @Sekhat 是的,每片
  • 嗨,我知道这个问题很老,但只是想澄清一下。 ZSlices 的数量是否应该等于纹理的 z 维度?即,在 256x256x128 纹理的情况下,是否会有 128 个 zslice,因此会有 128 个绘制调用?
猜你喜欢
  • 1970-01-01
  • 2012-08-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-10-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多