2011-08-15 130 views
5

我很想知道如何在OpenGL中模拟老游戏(如Atari 2600)的低分辨率来做fps游戏。我想最好的办法是将缓冲区写入纹理,放到四边形上并显示为屏幕分辨率。OpenGL中的低分辨率模仿老游戏

看看的http://www.youtube.com/watch?v=_ELRv06sa-c,例如(伟大的比赛!)

任何意见,帮助或样本代码将受到欢迎。

+0

这看起来很酷。我不是那种OpenGL的经验,但不能用基本的GLSL片段着色器实现像素化效果?似乎还有一些单色噪声/颗粒,它可能只是视频压缩,但可能会在快速运动中模糊不清。 –

+0

@George我不确定你是否可以用片段着色器来做到这一点。 –

回答

8

我认为最好的办法就像你说的那样,把所有东西都渲染成低分辨率的纹理(最好用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); 
+0

结果非常好。现在我的新挑战是将这个fbo(渲染低分辨率)与glsl(片段着色器添加后期制作着色器)混合。谢谢! – xbelanch

+1

一年后,你的答案再次帮助我。我在试图在低resz中复制着色器片段时遇到了另一个大问题(哈哈,似乎是我的痴迷!)。我与您分享视频:http://www.youtube.com/watch?v = 9KPgjS7QSUA – xbelanch

相关问题