读取openGL帧缓冲区的不同部分,保持重叠



我需要对openGL之前绘制的帧缓冲区数据进行一些CPU操作。有时,我需要绘制的分辨率高于纹理分辨率,因此我考虑为视口和目标FBO选择一个SIZE,绘制,读取CPU缓冲区,然后将视口移动到空间中的其他地方并重复。在我的CPU内存中,我将拥有所有需要的颜色数据。不幸的是,出于我的目的,我需要在瓷砖的垂直和水平边界之间保持1个像素的重叠。因此,想象一个四块大小为size x size:的瓷砖的情况

0 1
2 3

例如,我需要使瓦片0的最后一列数据保持瓦片1的第一列数据的相同数据,并且瓦片0的最终一行数据保持瓦片2的第一行的相同数据。因此,我将得出的总分辨率将是

SIZEW * ntilesHor -(ntilesHor-1) x SIZEH * ntilesVer -(ntilesVer-1)

对于semplicity,SIZEW和SIZEH将是相同的,对于ntilesVer和ntilesHor也是相同的。我的代码现在看起来像

glBindFramebufferEXT(GL_FRAMEBUFFER_EXT, fbo);
glViewport(0, 0, tilesize, tilesize);
glPolygonMode(GL_FRONT, GL_FILL);
for (int i=0; i < ntiles; ++i)
{
    for (int j=0; j < ntiles; ++j)
    {
        tileid = i * ntiles +j;
        int left = max(0, (j*tilesize)- j);
        int right = left + tilesize;
        int bottom = max(0, (i*tilesize)- i);
        int top = bottom + tilesize;
        glEnable(GL_DEPTH_TEST);
        glDepthFunc(GL_LESS);
        glMatrixMode(GL_PROJECTION);
        glLoadIdentity();
        glOrtho(left, right, bottom, top, -1, 0);   
        glMatrixMode(GL_MODELVIEW);
        glLoadIdentity();
        glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
        // Draw display list
        glCallList(DList);
        // Texture target of the fbo
        glReadBuffer(tex_render_target);
        // Read to CPU to preallocated buffer
        glReadPixels(0, 0, tilesize, tilesize, GL_BGRA, GL_UNSIGNED_BYTE, colorbuffers[tileid]);
    }
}

代码运行,在各种缓冲区"colorbuffers"中,我似乎有类似于colordata的东西,也类似于我应该给出的绘图;只是,我需要的重叠不存在,即瓦片0的最后一列和瓦片1的第一列产生不同的值。知道吗?

    int left = max(0, (j*tilesize)- j);
    int right = left + tilesize;
    int bottom = max(0, (i*tilesize)- i);
    int top = bottom + tilesize;

我不确定这些差额。如果你的意图是基于像素的映射,正如你的视口所建议的那样,有一些恒定的重叠,那么-j-i项就没有意义了,因为它们是不均匀的。我想你想要一些恒定的价值。此外,您不需要max。不过,你想要一个1像素的重叠,所以你的常数将是0。因为那样你就有了

right_j == left_(j+1)

底部和顶部也是如此,这正是你想要的。

最新更新