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

时间:2012-07-12 22:03:19

标签: opengl textures overlap

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

0 1
2 3

我需要让tile 0的最后一列数据保存tile 1的第一列数据的相同数据,并且tile 0的最后一行数据保存tile 2的第一行的相同数据,例如。因此,我将绘制的总分辨率为

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

为了简洁起见,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的第一列产生不同的值。 有什么想法吗?

1 个答案:

答案 0 :(得分:0)

    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)

和底部和顶部相同,这正是你想要的。