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

时间:2010-09-25 16:09:26

标签: opengl graphics rendering real-time cube

我想通过使用opengl绘制体素,但似乎不支持它。我制作了一个具有24个顶点(每个面4个顶点)的立方体绘图功能,但是当你绘制2500个立方体时它会降低帧速率。我希望有更好的方法。理想情况下,我只想向显卡发送位置,边缘大小和颜色。我不确定是否可以通过使用GLSL将指令编译为片段着色器或顶点着色器的一部分来实现此目的。

我搜索谷歌,发现了点精灵和广告牌精灵(同样的事情?)。这些可以用作更快地绘制立方体的替代方法吗?如果我使用6,每张脸一个,似乎会向显卡发送更少的信息,并希望获得更好的帧速率。

另一个想法是,我可以使用一个drawelements调用绘制多个立方体?

也许有一种我不了解的更好的方法?任何帮助表示赞赏。

3 个答案:

答案 0 :(得分:13)

使用立方体绘制体素几乎总是错误的方法(特殊情况是光线追踪)。您通常想要做的是将数据放入3D纹理并根据摄像机位置渲染切片。请参阅此页面:https://developer.nvidia.com/gpugems/GPUGems/gpugems_ch39.html,您可以通过搜索“体积渲染gpu”找到其他技术。

答案 1 :(得分:6)

您正在寻找的是实例化。您可以查看glDrawElementsInstancedglDrawArraysInstanced的几种可能性。请注意,这些只是最近才作为核心操作添加(OGL 3.1),但已经延长了很长一段时间。

nVidia的OpenGL SDK有一个OpenGL中的实例绘图示例。

答案 2 :(得分:0)

首先,您应该使用GLSL查看OpenGL 3+。这已成为很长一段时间的标准。其次,大多数Minecraft-esque实现都在CPU端使用网格创建。该技术涉及查看所有块位置并创建顶点缓冲对象,该对象呈现所有暴露面的三角形。仅当体素改变并且在帧之间持续存在时才生成VBO。理想的实现方法是将相同纹理的共面面组合成更大的面。