我很想知道如何在OpenGL中模拟老游戏(如Atari 2600)的低分辨率来做fps游戏。我想最好的办法是将缓冲区写入纹理,放到四边形上并显示为屏幕分辨率。OpenGL中的低分辨率模仿老游戏
看看的http://www.youtube.com/watch?v=_ELRv06sa-c,例如(伟大的比赛!)
任何意见,帮助或样本代码将受到欢迎。
我很想知道如何在OpenGL中模拟老游戏(如Atari 2600)的低分辨率来做fps游戏。我想最好的办法是将缓冲区写入纹理,放到四边形上并显示为屏幕分辨率。OpenGL中的低分辨率模仿老游戏
看看的http://www.youtube.com/watch?v=_ELRv06sa-c,例如(伟大的比赛!)
任何意见,帮助或样本代码将受到欢迎。
我认为最好的办法就像你说的那样,把所有东西都渲染成低分辨率的纹理(最好用FBOs),然后通过绘制一个sceen大小的四边形来显示纹理(当然使用GL_NEAREST
作为纹理的放大滤镜)。也许您也可以使用glBlitFramebuffer
直接从低分辨率FBO复制到高分辨率帧缓冲区,但我不知道是否可以通过这种方式直接复制到默认帧缓冲区(显示的那个)。
编辑:仰视规范framebuffer_blit后,似乎你可以刚刚从低分辨率FBO复制到使用glBlitFramebuffer(EXT/ARB)
高清晰度默认帧缓冲区。这可能比使用纹理映射四边形更快,因为它完全绕过了顶点片段流水线(尽管这本来就是一个简单的流水线)。另一个优点是,如果需要,您还可以获得低分辨率深度和模板缓冲区,并且可以通过这种方式在低分辨率背景上渲染高分辨率内容,这可能是一个有趣的效果。所以会发生这样的事情:
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);
这看起来很酷。我不是那种OpenGL的经验,但不能用基本的GLSL片段着色器实现像素化效果?似乎还有一些单色噪声/颗粒,它可能只是视频压缩,但可能会在快速运动中模糊不清。 –
@George我不确定你是否可以用片段着色器来做到这一点。 –