我需要对以前由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的第一列产生不同的值。 有什么想法吗?
答案 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)
和底部和顶部相同,这正是你想要的。