19

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

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

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

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

4

3 回答 3

20

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

编辑:在编写上述答案时,我没有意识到 OP 很可能对 Minecraft 如何做到这一点感兴趣。有关加速 Minecraft 风格光栅化的技术,请查看用于渲染大量立方体的剔除技术。尽管随着图形硬件的最新进展,通过光线追踪渲染 Minecraft 可能会成为现实。

于 2010-09-25T17:37:28.923 回答
7

您正在寻找的东西称为实例化。你可以看看glDrawElementsInstancedglDrawArraysInstanced几个可能性。请注意,这些只是最近才添加为核心操作(OGL 3.1),但作为扩展提供了相当长的一段时间。

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

于 2010-09-25T16:41:15.667 回答
1

首先,您真的应该使用 GLSL 查看 OpenGL 3+。这已经是很长一段时间的标准了。其次,大多数 Minecraft 风格的实现在 CPU 端使用网格创建。该技术涉及查看所有块位置并创建一个顶点缓冲区对象,该对象呈现所有暴露面的三角形。VBO 仅在体素发生变化时生成并在帧之间保持不变。理想的实现是将相同纹理的共面面组合成更大的面。

于 2016-12-08T22:00:58.820 回答