读取openGL帧缓冲区的不同部分,保持重叠
我需要对openGL以前绘制的帧缓冲区数据执行一些CPU操作。有时,我需要绘制的分辨率高于纹理分辨率,因此我考虑为视口和目标FBO选择一个大小,绘制,读取CPU缓冲区,然后将视口移动到空间中的其他位置并重复。在我的CPU内存中,我将拥有所有需要的颜色数据。不幸的是,出于我的目的,我需要在瓷砖的垂直和水平边界之间保持1个像素的重叠。因此,想象一个四块大小为x的瓷砖的情况:读取openGL帧缓冲区的不同部分,保持重叠,opengl,textures,overlap,Opengl,Textures,Overlap,我需要对openGL以前绘制的帧缓冲区数据执行一些CPU操作。有时,我需要绘制的分辨率高于纹理分辨率,因此我考虑为视口和目标FBO选择一个大小,绘制,读取CPU缓冲区,然后将视口移动到空间中的其他位置并重复。在我的CPU内存中,我将拥有所有需要的颜色数据。不幸的是,出于我的目的,我需要在瓷砖的垂直和水平边界之间保持1个像素的重叠。因此,想象一个四块大小为x的瓷砖的情况: 0 1 2 3 例如,我需要让tile 0的最后一列数据包含tile 1的第一列数据的相同数据,而tile 0的最后一行数据
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]);
}
}
glBindFramebufferEXT(GL\u FRAMEBUFFER\u EXT,fbo);
glViewport(0,0,平铺化,平铺化);
glPolygonMode(GL_前端,GL_填充);
对于(整数i=0;i
代码运行时,在各种缓冲区“colorbuffers”中,我似乎拥有类似于colordata的内容,也类似于我应该绘制的内容;只是,我需要的重叠并不存在,即tile 0的最后一列和tile 1的第一列产生不同的值。
有什么想法吗
我不确定这些利润率。如果您的意图是基于像素的贴图,如视口所示,具有一些恒定的重叠,则-j
和-i
术语没有意义,因为它们是不一致的。我想你需要一些常数。另外,您不需要在那里设置max
。不过,您需要1个像素的重叠,因此常量将为0。因为那时你有
right_j == left_(j+1)
底部和顶部也是一样,这正是您想要的。在对glReadBuffer的调用中,是
tex\u render\u target==GL\u COLOR\u ATTACHMENT0+i
?您不能使用任意值或纹理ID作为读取缓冲区源。是的,这是我的错,因为我没有弄清楚。很抱歉,但我不明白:要使我的重叠,我不应该让左_u(j+1)=右_j+1吗?这取决于您如何计算椎间盘。如果你认为上限是排他性的,那么你是对的。然而,我假设了一个包含的间隔,这也是glViewport和glOrtho定义的,在这种情况下,它们已经共享了一个像素宽的边框,这样做。我认为这是正确的,因为它指出了opengl在设置视口时是如何处理边框的。
right_j == left_(j+1)