【问题标题】:OpenGL tile rendering: most efficient way?OpenGL平铺渲染:最有效的方式?
【发布时间】:2012-07-27 05:33:36
【问题描述】:

我正在创建一个基于图块的 2D 游戏,作为学习基本“现代”OpenGL 概念的一种方式。我正在使用带有 OpenGL 2.1 的着色器,并且熟悉渲染管道以及如何在屏幕上实际绘制几何图形。我想知道的是组织瓷砖地图以快速有效地渲染的最佳方式。我想到了几种可能的方法:

1.) 将表示单个图块(顶点和纹理坐标)的四边形存储在 VBO 中,并使用单独的 draw* 调用渲染每个图块,将其转换到屏幕上的正确位置并使用 uniform2i 给出位置在该特定图块的纹理图集中;

2.) 保留一个包含屏幕上每个图块(已计算的屏幕坐标和纹理图集坐标)的 VBO,使用 BufferSubData 每帧更新图块,但使用单个 draw* 调用;

3.) 保留包含静态 NxN“块”图块的 VBO,绘制许多图块块至少在屏幕上部分可见,并将它们各自转换到位置。

*如果可能,我希望远离最后一个选项,除非渲染 64x64 的块不是太低效。瓷砖以该大小​​的块加载到内存中,即使一次只能在屏幕上看到大约 20x40 的瓷砖,我也必须一次渲染多达四个块。这种方法还会使我的代码在其他几个方面变得复杂。

那么,其中哪一种是渲染图块屏幕的最有效方法?有没有更好的方法?

【问题讨论】:

    标签: performance opengl graphics 2d


    【解决方案1】:

    你可以做其中任何一个,他们可能会很好;您要渲染的内容非常非常简单。

    #1 原则上肯定会比其他选项更差,因为您将绘制许多极其简单的“模型”,而不是让 GPU 在一次绘制调用上完成大量批处理工作.但是,如果您只有 20×40 = 800 个图块同时在屏幕上可见,那么这对于任何现代 CPU 和 GPU 来说都是微不足道的工作量(除非您正在做一些疯狂的片段着色器) .

    我建议您使用最适合您的编程方式,这样您就可以继续开发您的游戏。我想这将是#1,或者可能是#2。 如果以及何时您发现自己遇到了性能问题,请执行 #2 或 #3 中的任何一个(64×64 听起来像是一个很好的块大小)可以让您在程序上花费最少的 CPU 时间 的绘图部分(即更新缓冲区)。

    【讨论】:

    • 好的,经过对“批处理”的进一步研究,我想我会选择#2。感谢您的回答!
    【解决方案2】:

    我最近一直在通过 Android 上的 OpenGL ES 2.0 自己学习现代 OpenGL。 OpenGL ES 2.0 编程指南推荐使用“结构数组”,即

    “将顶点属性一起存储在单个缓冲区中。该结构表示顶点的所有属性,并且每个顶点都有这些属性的数组。”

    虽然这看起来一开始会占用大量空间,但它允许使用 VBO 进行高效渲染,并且可以灵活地对每个图块进行纹理映射。我最近使用包含顶点、法线、颜色和纹理数据的交错数组为 Droid 2 上的 20x20 tile hex 网格做了一个 tile hex 网格。到目前为止,一切运行顺利。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-05-14
      • 1970-01-01
      • 1970-01-01
      • 2020-08-24
      • 2014-10-23
      • 2019-08-09
      • 2016-06-04
      相关资源
      最近更新 更多