0

我需要对之前由 openGL 绘制的帧缓冲区数据进行一些 CPU 操作。有时,我需要绘制的分辨率高于纹理分辨率,因此我考虑为视口和目标 FBO 选择 SIZE,绘制,读取到 CPU 缓冲区,然后将视口移动到空间中的其他位置并重复。在我的 CPU 内存中,我将拥有所有需要的颜色数据。不幸的是,出于我的目的,我需要在我的图块的垂直和水平边界之间保持 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)

对于 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”中,我似乎有一些看起来像颜色数据的东西,也类似于我应该给我的平局;只是,我需要的重叠不存在,即 tile 0 的最后一列和 tile 1 的第一列产生不同的值。任何的想法?

4

1 回答 1

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

我不确定这些边距。如果您的意图是根据您的视口建议的基于像素的映射,并且有一些恒定的重叠,那么-jand-i术语没有意义,因为它们是不均匀的。我认为你想要一些恒定的价值。你也不需要那个max。你想要一个 1 像素的重叠,所以你的常数将为 0。因为你有

right_j == left_(j+1)

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

于 2012-07-13T00:37:55.473 回答