【问题标题】:low resolution in OpenGL to mimic older gamesOpenGL中的低分辨率以模仿旧游戏
【发布时间】:2011-08-16 06:30:13
【问题描述】:

我很想知道如何在 OpenGL 中模仿旧游戏(如 Atari 2600)的低分辨率来制作 fps 游戏的正确方法。我想最好的方法是将缓冲区写入纹理,放入四边形并将其显示为屏幕分辨率。

看看http://www.youtube.com/watch?v=_ELRv06sa-c,例如(很棒的游戏!)

欢迎任何建议、帮助或示例代码。

【问题讨论】:

  • 这看起来很酷。不是那种使用 OpenGL 的经验,但是不能用基本的 GLSL 片段着色器来实现像素化效果吗?似乎还有一些单色噪点/颗粒,可能只是视频压缩,但在快速运动时可能有点模糊。
  • @George 我不确定您是否可以仅使用片段着色器来做到这一点。

标签: opengl


【解决方案1】:

我认为最好的方法就是像你说的那样,将所有内容渲染为低分辨率纹理(最好使用 FBOs 完成),然后通过绘制屏幕大小的四边形来显示纹理(当然使用GL_NEAREST 作为纹理的放大过滤器)。也许你也可以使用glBlitFramebuffer直接从低分辨率FBO复制到高分辨率帧缓冲区,虽然我不知道你是否可以通过这种方式直接复制到默认帧缓冲区(显示的那个)。

编辑:在查找 framebuffer_blit 的规范后,您似乎可以使用 glBlitFramebuffer(EXT/ARB) 从低分辨率 FBO 复制到高分辨率默认帧缓冲区中。这可能比使用纹理映射四边形更快,因为它完全绕过了顶点片段管道(尽管这本来很简单)。另一个优点是,如果需要,您还可以获得低分辨率深度和模板缓冲区,并且可以通过这种方式在低分辨率背景上渲染高分辨率内容,这可能是一个有趣的效果。所以它会以某种方式发生:

generate FBO with low-res renderbuffers for color and depth (and stencil)
...
glBindFramebuffer(GL_FRAMEBUFFER, lowFBO);
render_scene();
glBindFramebuffer(GL_DRAW_FRAMEBUFFER, 0);
glBlitFramebuffer(0, 0, 640, 480, 0, 0, 1024, 768, 
    GL_COLOR_BUFFER_BIT [| GL_DEPTH_BUFFER_BIT], GL_NEAREST);

【讨论】:

  • 结果非常好。现在我的新挑战是将这个 fbo(渲染低分辨率)与 glsl(片段着色器以添加后期制作着色器)混合。谢谢!
  • 一年后,您的回答再次帮助了我。我在尝试以低分辨率复制着色器片段时遇到了另一个大问题(哈哈,这似乎是我的痴迷!)。视频分享给大家:youtube.com/watch?v=9KPgjS7QSUA
猜你喜欢
  • 2012-11-20
  • 2014-05-08
  • 1970-01-01
  • 1970-01-01
  • 2014-01-24
  • 1970-01-01
  • 2017-02-16
  • 2015-03-04
  • 1970-01-01
相关资源
最近更新 更多