2

我正在使用 GLSL 在 OpenGL (3.X) 中实现“景深”。它工作得很好,中央深度被着色器(纹理(tex1,vec2(0.5)))占用以进行自动对焦。但是使用这样的实现焦点会立即发生。他应该喜欢眼睛——逐渐适应。为此,我需要 CPU 内存一侧中间的深度。我知道如何使用 PBO,用它来读取像素/像素颜色工作得非常快(异步运行),但是将 GL_RGB 更改为 GL_DEPTH_COMPONENT 性能会急剧下降。你知道有什么方法可以比较快地读取中心深度是什么颜色吗?

    glReadPixels(a/2, b/2, 1, 1, GL_RGB , GL_BYTE, 0); // WORKS FINE - 30 ns
    glReadPixels(a/2, b/2, 1, 1, GL_DEPTH_COMPONENT, GL_BYTE, 0); // WORKS SLOOOW - around 3500 microseconds
    glReadPixels(a/2, b/2, 1, 1, GL_DEPTH_COMPONENT, GL_FLOAT, 0); // WORKS SLOOOW- around 3500 microseconds

@EDIT:创建 FBO 纹理:

glTexImage2D(GL_TEXTURE_2D, 0,GL_DEPTH_COMPONENT32F , sett.framebuffer_width,  sett.framebuffer_height, 0,GL_DEPTH_COMPONENT, GL_FLOAT, 0);

下载深度:

index = (index + 1) % 2;// for ping-pong PBO
nextIndex = (index + 1) % 2;// for ping-pong PBO
glBindBuffer(GL_PIXEL_PACK_BUFFER_ARB, pboIds[index]);
glReadPixels(w/2, h/2, 1, 1, GL_DEPTH_COMPONENT , GL_FLOAT, 0);
glBindBuffer(GL_PIXEL_PACK_BUFFER_ARB, 0);

将深度复制到内存:

GLfloat tabc[10];
glBindBuffer(GL_PIXEL_PACK_BUFFER_ARB, pboIds[nextIndex]);
GLfloat* srccccc = (GLfloat*)glMapBuffer(GL_PIXEL_PACK_BUFFER, GL_READ_ONLY);
tabc[0]=*srccccc;
std::cout<<"Depth center: "<<tabc[0]<<std::endl;//only to check is that correct
glUnmapBuffer(GL_PIXEL_PACK_BUFFER_ARB);     

它现在可以工作了,速度要快得多(从 3500 微秒到 357 微秒)。现在还好吗?所有格式?

4

1 回答 1

3
于 2013-08-02T00:59:56.223 回答