我需要对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)
底部和顶部也是如此,这正是你想要的。