11

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

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

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

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

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

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

4

2 回答 2

9

您可以执行其中任何一项,它们可能会很好;您要渲染的内容非常非常简单。

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

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

于 2012-07-29T05:38:42.847 回答
0

我最近一直在通过 Android 上的 OpenGL ES 2.0 自己学习现代 OpenGL。OpenGL ES 2.0 Programming Guide 建议使用“结构数组”,即

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

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

于 2012-07-29T19:08:40.587 回答