2010-09-25 72 views
13

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

我搜索谷歌,发现有关点精灵和广告牌小精灵(同样的事情?)。那些可以用来替代更快地绘制立方体吗?如果我使用6个,每个面对一个,那么看起来这样会将更少的信息发送到显卡,并希望获得更好的帧速率。

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

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

回答

12

用立方体绘制立体像素几乎总是错误的方法(例外情况是光线跟踪)。你通常想要做的是将数据放入3D纹理中,并根据相机位置渲染切片。看到这个页面:https://developer.nvidia.com/gpugems/GPUGems/gpugems_ch39.html,你可以通过搜索“volume rendering gpu”找到其他技术。

+0

是的,沿着与视线方向最一致的轴回到前面。首先渲染具有透明度的四边形。一旦这个工作,你可以尝试在每个图层之间插入“边”。 – phkahler 2010-09-27 16:58:15

+0

您的链接已被破坏。 – Ruslan 2017-05-06 18:29:32

+0

@Ruslan更新 – ybungalobill 2017-05-06 18:33:47

5

你在找什么叫做实例。你可以看看glDrawElementsInstancedglDrawArraysInstanced有几种可能性。请注意,这些只是作为最近的核心操作(OGL 3.1)添加的,但已经可以延长很长时间了。

nVidia的OpenGL SDK有一个OpenGL实例化绘图的例子。

0

首先你真的应该看看使用GLSL的OpenGL 3+。这已经是相当长一段时间的标准。其次,大多数Minecraft样式实现在CPU侧使用网格创建。该技术涉及查看所有块位置并创建渲染所有暴露面的三角形的顶点缓冲区对象。 VBO仅在体素改变并在帧之间持续时生成。一个理想的实现可以将具有相同纹理的共面面组合成更大的面。

相关问题