帧缓冲区剪切任何绘制的屏幕'关闭屏幕'

时间:2014-10-03 15:38:53

标签: c++ opengl framebuffer clipping

我最近在我的简单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

帧缓冲区的宽度和高度现在与屏幕的宽度和高度相同,但只有一小部分图形,这是实际绘制的一小部分到。

任何人都有任何线索?如果需要更多的代码部分,我很乐意承担责任,但整个过程太过分了。

0 个答案:

没有答案