在OpenGL中绘制体素(立方体)的最有效方法是什么?

20
我希望使用OpenGL绘制体素,但似乎不支持。我已经编写了一个绘制立方体的函数,每个面有4个顶点,但当绘制2500个立方体时,会降低帧率,所以我希望能找到更好的方法。理想情况下,我只需向图形卡发送位置、边缘大小和颜色即可。我不确定是否可以使用GLSL将指令编译为片段着色器或顶点着色器的一部分来实现这一点。
我在谷歌上搜索并发现了点精灵和广告牌精灵(一样的吗?)。它们可以作为绘制立方体的替代方法吗?如果我使用6个,每个代表一个面,似乎会向图形卡发送更少的信息,并希望获得更好的帧率。
另一个想法是也许可以使用一个drawelements调用来绘制多个立方体?
也许有一种更好的方法我还不知道?任何帮助都将不胜感激。
3个回答

21
用立方体来绘制体素几乎总是不正确的方法(特殊情况是光线跟踪)。通常您想做的是将数据放入三维纹理中,并根据相机位置渲染切片。请参见此页面:https://developer.nvidia.com/gpugems/GPUGems/gpugems_ch39.html,您可以通过搜索“volume rendering gpu”找到其他技术。 编辑: 在撰写上述答案时,我没有意识到问题发布者最有可能对Minecraft如何实现该功能感兴趣。要了解加速类似于Minecraft风格的光栅化的技术,请查看Culling techniques for rendering lots of cubes。尽管随着图形硬件的最新进展,通过光线跟踪渲染Minecraft可能成为现实。

是的,沿着与视角最相符的轴向进行反向渲染。首先使用透明度渲染四边形。一旦这样可以工作,您可以尝试在每个层之间插入“侧面”。 - phkahler
你的链接现在已经失效了。 - Ruslan
1
@ybungalobill使用DOOM技术在3D中而不是使用图层对于初学者来说更有趣,但是这个想法几乎是相同的。 - Spektre

8
你需要的是实例化。你可以看一下 glDrawElementsInstancedglDrawArraysInstanced 以了解其中的一些可能性。请注意,这些操作只是最近(OGL3.1)作为核心操作添加的,但作为扩展已经存在了很长时间。
nVidia 的 OpenGL SDK 中有一个关于 OpenGL 实例化绘图的示例。

1

首先,你应该使用OpenGL 3+和GLSL进行编程。这已经成为了相当长一段时间的标准。其次,大多数类似于Minecraft的实现都在CPU端进行网格创建。该技术涉及查看所有块位置,并创建一个顶点缓冲对象,可以呈现所有暴露的面的三角形。 VBO仅在体素更改时生成,并在帧之间保留。理想的实现将相同纹理的共面面合并成较大的面。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接