我最近在我的简单2D引擎中实现了放大/缩小功能,并在相邻纹理之间经历了一些可怕的接缝,如下所示:
http://oi59.tinypic.com/anmxyf.jpg
它看起来并不那么糟糕,但是当它四处移动时不断眨眼时,它肯定很烦人。
我决定更改它,所以游戏的很大一部分(尽管玩家可以缩小)反而在帧缓冲区上绘制,然后我打印帧缓冲区,当放大或缩小它而不是增加/减少帧缓冲纹理大小,以避免接缝。
起初我决定在默认缩放时绘制5倍于玩家可见的数量,所以我制作了一个纹理5倍大的帧缓冲对象,然后绘制它。
这是framebuffer对象的初始化:
glGenFramebuffers(1, &main_framebuffer);
glBindFramebuffer(GL_FRAMEBUFFER, main_framebuffer);
glClearColor(0.f, 0.f, 0.f, 1.f);
glClear(GL_COLOR_BUFFER_BIT);
glGenTextures(1, &main_ColorBuffer);
glBindTexture(GL_TEXTURE_2D, main_ColorBuffer);
glTexImage2D(
GL_TEXTURE_2D, 0, GL_RGBA, SCREEN_BUFFER_WIDTH, SCREEN_BUFFER_HEIGHT, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL
);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glFramebufferTexture2D(
GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, main_ColorBuffer, 0
);
其中SCREEN_BUFFER_WIDTH和SCREEN_BUFFER_HEIGHT设置为默认屏幕大小的五倍。然后我像往常那样画出我的世界(我可以随心所欲地缩小我的世界,一切都很好,除了接缝)。
问题是只有1024 x 768(默认屏幕大小)被绘制到帧缓冲区。这是我如何激活,绘制到帧缓冲区,然后绘制帧缓冲区:
glBindFramebuffer(GL_FRAMEBUFFER, main_framebuffer);
glClearColor(0.0, 0.0, 0.0, 0.0);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
draw_blocks(); //draws all the blocks in the correct screen y and x position
glBindFramebuffer(GL_FRAMEBUFFER, 0);
glBindTexture(GL_TEXTURE_2D, main_ColorBuffer);
draw_quad(shift_y*ratio, shift_x*ratio, SCREEN_BUFFER_WIDTH*ratio, SCREEN_BUFFER_HEIGHT*ratio);
glBindTexture(GL_TEXTURE_2D, 0);
其中ratio是我用于放大和缩小的float和shift_y以及shift_x我用来移动帧缓冲纹理以更好地了解事情的进展。
通过缩小和移动帧缓冲区,我得到了这个:
http://oi61.tinypic.com/34zlpip.jpg
它只能绘制一小部分屏幕(如果我不缩小,它会完全适合屏幕)。
相比之下,如果我在使用帧缓冲之前完全缩放(然后是一些)并且直接绘制到屏幕上,这就是它的样子:
http://oi61.tinypic.com/21akbit.jpg(空白部分只是尚未加载的块,因为播放器不应该能够缩小这么多)。
我真的很难过,我在尝试之前尝试更改视口,但这几乎没有。
我还要注意到,我非常有信心实际的帧缓冲纹理对象实际上是被吸引到它的五倍大,因为如果我不这样做的话。在我的draw_quad函数中拉伸它,而不是给它与屏幕相同的宽度和高度,我得到这个:
http://oi62.tinypic.com/4triiu.jpg
帧缓冲区的宽度和高度现在与屏幕的宽度和高度相同,但只有一小部分图形,这是实际绘制的一小部分到。
任何人都有任何线索?如果需要更多的代码部分,我很乐意承担责任,但整个过程太过分了。