【问题标题】:What is the most efficient way to draw voxels (cubes) in opengl?在opengl中绘制体素(立方体)的最有效方法是什么?
【发布时间】:2011-04-17 04:59:18
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: opengl graphics rendering real-time cube


    【解决方案1】:

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

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

    【讨论】:

    • 是的,沿着与视图方向最对齐的轴从后到前渲染。首先渲染具有透明度的四边形。一旦可行,您也可以尝试在每一层之间插入“边”。
    • 您的链接现在已损坏。
    • @ybungalobill 使用DOOM technique in 3D 而不是层对于初学者来说更有趣,但想法几乎相同
    【解决方案2】:

    您要查找的内容称为实例化。您可以查看glDrawElementsInstancedglDrawArraysInstanced 了解几种可能性。请注意,这些只是最近才作为核心操作 (OGL 3.1) 添加的,但作为扩展提供的时间已经很长了。

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-05-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多