【发布时间】:2011-10-16 19:30:40
【问题描述】:
我对 OpenGL 还很陌生,只是想要一些快速的建议。我想为游戏绘制平铺背景。我想这意味着将一大堆类似精灵的对象绘制到屏幕上。我有大约 48 列到 30 行,因此有 1440 个图块(图块会根据游戏而变化,因此我无法预渲染整个网格)。
目前在启动时,我创建了 6 个不同的 FBO(使用 OpenFrameworks 中的 ofFbo 类),它们充当 6 个不同的图块。然后我绘制这些缓冲区,最多 1400 次,为每个图块选择一个。所以只有6个fbo,只是被抽了很多次。 (缓冲区在启动时被绘制,一旦创建就永远不会改变)。
for (int x=0; x<columns; x++) {
for (int y=0; y<rows; y++) {
// Get tile type and rotation from tile struct.
tileNum = tile.form
rotNum = tile.rot
// Draw image/texture/fbo that's stored in a std vector.
tileSet->draw(x*TILESIZE, y*TILESIZE, TILESIZE, TILESIZE);
}
}
我认为我的做法是错误的,并且想知道是否有人新的最佳/最佳方式来做到这一点。想像一个老式的 8 位视频游戏背景。这是我正在进行的工作的图像。
背景中的结构是我所说的精灵,不同的部分是内角、外(凹)角、方形填充和直边。很抱歉提出问题。
【问题讨论】:
-
我认为您一定是混淆了术语,或者您不了解 FBO 的用途。您不希望在一个场景中有 1440 个 FBO,甚至更多,因为您仍然必须以某种方式将图像带到屏幕上(绘制到 FBO 只会绘制到不可见的表面,除非它是默认的 FBO)。纹理四边形是您想要的。还有,5000微秒就是5ms,作为帧时间是可以接受的(对应200fps左右)。
-
您已经编辑了您的问题,但您仍然不明白 FBO 是什么。不,纹理总是在视频内存中进行,不必每次都传输。是的,你错了,因为我完全无法理解你的问题。你可能在谈论 VBO 吗?如果您不确定,请查看这些概念的含义并重新表述您的问题。
-
嘿,感谢您的反馈,我认为可能是这样。我没有1440 fbos,抱歉我用错了。我实际上有 6 个,最多可以抽出 1440 次。虽然 5,000 微秒相当不错,但我仍然希望加快一点速度。游戏(角色和瓷砖网格已满)降至 30 fps,这还可以,但我不介意优化。网格是最慢的部分,所以我认为它应该是我首先想到的。我改写了问题,再次感谢。