Невозможно использовать glGetTexImage для чтения текстуры карты глубины - PullRequest
0 голосов
/ 17 июня 2020

Я успешно создал объект буфера кадра и создал текстуру, содержащую карту глубины моей сцены. Я знаю, что делаю это правильно, поскольку применяю свою текстуру к прямоугольнику, и она выглядит нормально:

enter image description here

Теперь я хотел бы прочитать значения из текстуры, которую я создал в своей основной программе, а не внутри шейдеров. Изучив его, я узнал о двух функциях, а именно: glGetTexImage () и glReadPixels (). Поскольку я новичок в openGL, документация по ним вызывает больше вопросов, чем ответов. Посмотрев на коды других здесь, я нашел решение:

    renderSceneOnFrameBuffer();//I'm excluding the first pass code since it works fine
    GLfloat *data = new GLfloat(1024 * 768);
    glActiveTexture(GL_TEXTURE0);
    glBindTexture(GL_TEXTURE_2D, fbTexture);
    glGetTexImage(GL_TEXTURE_2D, 0, GL_DEPTH_COMPONENT, GL_FLOAT, data);//Access Violation Error

    // Rectangle 
    glBindFramebuffer(GL_FRAMEBUFFER, 0);
    glUseProgram(rectShaderProgram);
    glBindVertexArray(rectangleVAO);
    glUniform1i(khTextureLocation, 0);
    glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_INT, 0);

Я получаю ошибку нарушения прав доступа при использовании glGetTexImage. Что я делаю не так?

Я включу строки кода, в которых я объявляю свой FBO, на случай, если это имеет значение:

glGenFramebuffers(1, &FBO);
glBindFramebuffer(GL_FRAMEBUFFER, FBO);

glGenTextures(1, &fbTexture);
glBindTexture(GL_TEXTURE_2D, fbTexture);
glTexImage2D(GL_TEXTURE_2D, 0, GL_DEPTH_COMPONENT, 1024, 768, 0, GL_DEPTH_COMPONENT,
    GL_FLOAT, NULL);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);

glFramebufferTexture2D(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_TEXTURE_2D,
    fbTexture, 0);

glDrawBuffer(GL_NONE);
glReadBuffer(GL_NONE);

Кроме того, я получаю такую ​​же ошибку нарушения при использовании glReadPixels (), как это

    `GLfloat *data = new GLfloat(1024 * 768);
    glBindFramebuffer(GL_READ_FRAMEBUFFER, FBO);
    glReadPixels(0, 0, 1024, 768, GL_DEPTH_COMPONENT, GL_FLOAT, data);`

1 Ответ

0 голосов
/ 17 июня 2020

Буфер кадра может иметь несколько вложений вместе с глубиной. Используйте glReadPixel (), если хотите прочитать вложение буфера кадра.

glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
glPixelStorei(GL_PACK_ALIGNMENT, 1);

data  = (GLfloat *) malloc(1024* 768 * sizeof(GLfloat));
assert(data!=nullptr);

glBindFramebuffer(GL_READ_FRAMEBUFFER, fboId);
glReadBuffers(GL_NONE); // Do this call only if you dont have any other attachment that color in Frame buffer
glReadPixels(0, 0, 1024, 768, GL_DEPTH_COMPONENT, GL_FLOAT, &data[0]);

glGetTexture () используется для чтения данных из текстур.

И еще кое-что. Используйте форматы размера при создании текстуры фреймбуфера, например GL_DEPTH_COMPONENT32F->, будет отображаться на readpixel как GL_DEPTH_COMPONENT, GL_FLOAT.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...