我需要对之前由 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 的第一列产生不同的值。任何的想法?