Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/opengl/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
读取openGL帧缓冲区的不同部分,保持重叠_Opengl_Textures_Overlap - Fatal编程技术网

读取openGL帧缓冲区的不同部分,保持重叠

读取openGL帧缓冲区的不同部分,保持重叠,opengl,textures,overlap,Opengl,Textures,Overlap,我需要对openGL以前绘制的帧缓冲区数据执行一些CPU操作。有时,我需要绘制的分辨率高于纹理分辨率,因此我考虑为视口和目标FBO选择一个大小,绘制,读取CPU缓冲区,然后将视口移动到空间中的其他位置并重复。在我的CPU内存中,我将拥有所有需要的颜色数据。不幸的是,出于我的目的,我需要在瓷砖的垂直和水平边界之间保持1个像素的重叠。因此,想象一个四块大小为x的瓷砖的情况: 0 1 2 3 例如,我需要让tile 0的最后一列数据包含tile 1的第一列数据的相同数据,而tile 0的最后一行数据

我需要对openGL以前绘制的帧缓冲区数据执行一些CPU操作。有时,我需要绘制的分辨率高于纹理分辨率,因此我考虑为视口和目标FBO选择一个大小,绘制,读取CPU缓冲区,然后将视口移动到空间中的其他位置并重复。在我的CPU内存中,我将拥有所有需要的颜色数据。不幸的是,出于我的目的,我需要在瓷砖的垂直和水平边界之间保持1个像素的重叠。因此,想象一个四块大小为x的瓷砖的情况:

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)