Я успешно создал объект буфера кадра и создал текстуру, содержащую карту глубины моей сцены. Я знаю, что делаю это правильно, поскольку применяю свою текстуру к прямоугольнику, и она выглядит нормально:
Теперь я хотел бы прочитать значения из текстуры, которую я создал в своей основной программе, а не внутри шейдеров. Изучив его, я узнал о двух функциях, а именно: 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);`