使用PBO的深度值的非阻止GLREAD像素



我正在读取一个像素的深度,从flamebuffer到实现选择。最初,我的GlreadPixels((花费很长时间(5ms左右(,在Nvidia上,它甚至在此期间甚至会燃烧100%的CPU。在英特尔上也很慢,但是闲置了CPU。

从那时起,我使用了PixelBufferObject功能, pbo ,用这个众所周知的示例使GlreadPixels Asynchronous和双重缓冲。

这种方法效果很好,让我做一个glreadpixels((调用异步,但前提是我读取RGBA 值。如果我使用相同的PBO方法来读取深度值,则再次glreadpixels((再次阻止。

阅读rgba:glreadpixels((需要12µs。

阅读深度:glreadpixels((需要5ms。

我在Nvidia和Intel驱动程序上尝试了此操作。具有不同格式/类型组合。我尝试了:

glReadPixels( srcx, srcy, 1, 1, GL_DEPTH_COMPONENT, GL_FLOAT, 0 );

和:

glReadPixels( srcx, srcy, 1, 1, GL_DEPTH_STENCIL, GL_UNSIGNED_INT_24_8, 0 );

和:

glReadPixels( srcx, srcy, 1, 1, GL_DEPTH_STENCIL, GL_FLOAT_32_UNSIGNED_INT_24_8_REV, 0 );

这些都不会导致异步GlreadPixels((调用。但是,如果我读取以下呼叫的RGBA值:

glReadPixels( srcx, srcy, 1, 1, GL_RGBA, GL_UNSIGNED_BYTE, 0 );

然后glreadpixels((立即返回,因此不再阻止。

阅读单像素之前,我愿意:

glReadBuffer( GL_FRONT );
glBindBuffer( GL_PIXEL_PACK_BUFFER, pboid );

,我用以下方式创建了双缓冲PBO

glGenBuffers( NUMPBO, pboids );
for ( int i=0; i<NUMPBO; ++i )
{
    const int pboid = pboids[i];
    glBindBuffer( GL_PIXEL_PACK_BUFFER, pboid );
    glBufferData( GL_PIXEL_PACK_BUFFER, DATA_SIZE, 0, GL_STREAM_READ );
    ...

我使用带有深度尺寸24,模板大小8和默认双缓冲区的SDL2创建框架缓冲器。

我正在使用ubuntu lts上的OpenGL Core配置文件3.3。

我实际上没有读取像素深度(通过glmapbuffer(,直到下一个帧,因此没有同步。Glread像素应该触发异步操作并立即返回(就像RGBA一样(。但这不是为了阅读深度。

需要两个深度缓冲区。但是不是。多屏障是指颜色缓冲区的数量,因为这些数字实际上显示了。实现几乎永远不会给您多个深度缓冲区。

为了为深度缓冲区的读取,必须在"下一个帧"之前进行读取。因此需要同步。

一般来说,最好从您自己的图像中读取。这样,您就可以完全控制格式,当重复使用之类的东西之类的东西,因此您可以控制同步问题。如果您需要两个深度缓冲区,以便可以在使用另一个深度缓冲区时从一个缓冲区中阅读,则需要创建它。

和fyi:由于像素所有权问题等,从默认的framebuffer中读取根本是可疑的。但是从 front 缓冲区阅读几乎总是错误的事情。

最新更新