【问题标题】:OpenGL texture vs FBOOpenGL 纹理与 FBO
【发布时间】: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,这还可以,但我不介意优化。网格是最慢的部分,所以我认为它应该是我首先想到的。我改写了问题,再次感谢。

标签: c++ opengl


【解决方案1】:

我不太明白你的问题。纹理是可以应用于多边形的(通常是二维的)图像,而FBO (framebuffer object) 是一种可以渲染到而不是屏幕的屏幕外缓冲区,通常用于直接渲染到纹理中。因此,我看不出您的问题在哪里可能是“纹理与 FBO”,因为它们是非常正交的概念,并且在您的示例中使用 FBO 没有任何意义。也许你用VBOs (vertex buffer objects)PBOs (pixel buffer objects) 搞乱了FBO?但是你的问题还是很不妥。

编辑:如果你真的在使用 FBO,那只是因为你认为它们神奇地将它们引用的纹理存储在视频内存中,那么请放心,纹理总是存储在视频中内存和在你的情况下使用 FBO 是完全没用的。

【讨论】:

  • 我想我明白我在哪里弄糊涂了。我正在使用 OpenFrameworks (openframeworks.cc),我认为它在较低的位置运行 openGL。他们有一个 FBO 课程,undef.ch/uploads/ofDoc/html/classof_fbo.html。通过使用它,我假设它们是纹理的某种替代品。所以我坚持的是我应该用它们还是只是简单的纹理。
  • @rykardo 他们的 FBO 类似乎是 OpenGL FBO 的包装器,因此仅当您想要将纹理渲染到 时才需要(在运行时生成图块)。对于普通纹理使用纹理。他们的 FBO 不是纹理的替代品,而是更复杂的东西,内部有纹理并且可以做额外的事情(渲染到这个纹理中)。但是看起来你可以像使用普通纹理一样使用它的内部纹理,所以如果你需要它的附加功能,使用它的纹理进行纹理应该不会对你的性能造成任何损害,因为这个纹理仍然是一个简单的纹理。
  • 好的,现在开始变得更有意义了,感谢您一直坚持我。我应该花一些时间学习行话,阅读文档等。
【解决方案2】:

我建议你只使用标准的 OpenGL 纹理。

我想我理解您想要做什么,但是 FBO 保留的信息远远超出您的需要,因此需要更长的时间才能呈现到您的目的地(即 FBO)。

【讨论】:

  • 好的,很好。是的,为了简化一些事情,我只想多次绘制同一组精灵。谢谢你的澄清。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-10-28
  • 2013-02-09
  • 1970-01-01
相关资源
最近更新 更多