буфер глубины чтения объекта framebuffer - PullRequest
0 голосов
/ 02 апреля 2020

Я пытаюсь скопировать буфер глубины fbo в вектор.

Я изначально начал с использования renderbuffers и glReadPixels, но это привело к вектору, заполненному нулями, несмотря на то, что glGetErrors() не выделяет вопросы.

Затем я переключился на текстуры и нарисовал их на экране. Цветная текстура показывает свидетельство проверки глубины, а текстура глубины показывает, что буфер глубины заполнен ожидаемыми значениями.

Я пролистал страницы OpenGL на кадровых буферах, страницу распространенных ошибок и прочитал документы по всем функции, а также прочитать первые 2 страницы результатов поиска Google по запросам, связанным с проблемой, но они не решают проблему и в основном используют старые версии OpenGL.

Я играл с буферами пакетов пикселей, упаковка, включение / отключение случайных настроек + привязка / открепление различных буферов.

Код примерно такой:

std::vector<GLuint> someVector; //also tried unsigned int
someVector.resize( windowWidth * windowHeight ); //also tried .reserve

glBindFramebuffer( GL_FRAMEBUFFER, fbo );
glEnable( GL_DEPTH_TEST );

drawStuff(); //I know this works

//Ive also tried making the depth buffer a depth_stencil buffer and reading a GL_UNSIGNED_INT_24_8

//glReadPixels( 0, 0, windowWidth, windowHeight GL_DEPTH_COMPONENT, GL_UNSIGNED_INT, &someVector[ 0 ] );
glBindTexture( GL_TEXTURE_2D, depthTexture );
glGetTexImage( GL_TEXTURE_2D, 0,
        GL_DEPTH_COMPONENT, GL_UNSIGNED_INT, &someVector[ 0 ] );
glBindTexture( GL_TEXTURE_2D, 0 );


glBindeFrameBuffer( GL_FRAMEBUFFER, fbo );

wrapperForGlGetErrors(); //this indicates all is good

Я на Ubuntu 18.04, использую opengl 3.3 и использую последнюю версию Драйверы nvidia.

Выход lspci | grep -i --color 'vga\|3d\|2d' равен

00:02.0 VGA compatible controller: Intel Corporation HD Graphics 630 (rev 04)
01:00.0 3D controller: NVIDIA Corporation GP107M [GeForce GTX 1050 Mobile] (rev a1)

Обновление

Делает:

unsigned int x;

    glReadPixels( 100, 100, 1, 1, GL_DEPTH_COMPONENT,
                  GL_UNSIGNED_INT, &x );
    std::cerr << x;

выводит 4294967295, а не 0.

1 Ответ

0 голосов
/ 02 апреля 2020

[...] выводит 4294967295, а не 0. [...]

Это ожидаемое поведение, 4294967295 равно 0xffffffff.

Глубина хранится в нормализованном формате с плавающей запятой (см. Нормализованное целое число ), поэтому значение 4294967295 (максимум 32-разрядного целого числа без знака) представляет 1,0. 1.0 является значением инициализации по умолчанию для буфера глубины (см. glClearDepth). Обратите внимание: glClear (GL_DEPTH_BUFFER_BIT) записывает 1.0 в буфер глубины текущего буфера кадров.

...