Получите глубину, хранящуюся в разных FBO, которые имеют разные шейдеры - PullRequest
0 голосов
/ 18 июня 2020

Цель моей программы - сравнить глубину камеры RGB-D и глубину OpenGL.

Камера обращена к модели (реальной) и имеет свои собственные шейдеры (фрагмент и вершину). ).

Для сравнения создается 3D-модель, у этой также есть свои собственные шейдеры (глубина обычно линеаризуется, поскольку я следовал тому, что объясняется в этом руководстве: https://learnopengl.com/Advanced-OpenGL/Depth-testing ).

Таким образом, сравнение будет проводиться по глубине, полученной от камеры, и глубине, связанной с 3D-моделью.

Итак, шаги, которые я сделал:

1. В функции инициализации

  1. Создайте по две текстуры для каждой (текстуры цвета и глубины).
  2. Создайте два FBO (один для камеры, другой для 3D-модели).
  3. Прикрепите текстуры к их FBO.
  /* Other stuff needed for initialization */

  ...

  // Generate color texture
  glGenTextures(1, &colorTex);
  glBindTexture(GL_TEXTURE_2D, colorTex);
  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
  glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA32F, _windowWidth, _windowHeight, 0, GL_RGBA, GL_UNSIGNED_BYTE, NULL);
  glBindTexture(GL_TEXTURE_2D, 0);

  // Generate depth texture
  glGenTextures(1, &depthTex);
  glBindTexture(GL_TEXTURE_2D, depthTex);
  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
  glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
  glTexImage2D(GL_TEXTURE_2D, 0, GL_DEPTH_COMPONENT, _windowWidth, _windowHeight, 0,  GL_DEPTH_COMPONENT, GL_FLOAT, NULL);
  glBindTexture(GL_TEXTURE_2D, 0);


  // Attach the color and depth textures to current FrameBuffer
  glGenFramebuffers(1, &_fboGL);
  glBindFramebuffer(GL_FRAMEBUFFER, _fboGL);
  glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, colorTex, 0);
  glFramebufferTexture2D(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_TEXTURE_2D, depthTex, 0);

В основная функция для рисования и рендеринга

  1. Визуализация потока камеры путем привязки его FBO.
  2. Рисование 3D-модели путем привязки собственного FBO.
  3. Попытка распечатать глубину openGL связанные с 3D-моделью.

Фрагмент кода выглядит следующим образом:

  glBindFramebuffer(GL_FRAMEBUFFER, fbo);
  glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, camColorTex, 0);
  glFramebufferTexture2D(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_TEXTURE_2D, camDepthTex, 0);


  glViewport(0, 0, windowWidth, windowHeight);
  glEnable(GL_DEPTH_TEST);
  glClearColor(0.25f, 0.25f, 0.25f, 1.f);
  glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

  /*******************************************/
  /* Some code for displaying camera stream  */
  /*******************************************/

  .............


  drawModelFunction();
  printDepthFunction();

  glBindFramebuffer(GL_FRAMEBUFFER, fbo);
  glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, camColorTex, 0);
  glFramebufferTexture2D(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_TEXTURE_2D, camDepthTex, 0);

  /***********************************************************/
  /* Some stuff to render a GUI to interact with the program */
  /***********************************************************/

  glBindFramebuffer(GL_DRAW_FRAMEBUFFER, 0);
  glBlitFramebuffer(0, 0, _windowWidth, _windowHeight, 0, 0, _windowWidth, _windowHeight, GL_COLOR_BUFFER_BIT, GL_LINEAR);
  glBlitFramebuffer(0, 0, _windowWidth, _windowHeight, 0, 0, _windowWidth, _windowHeight, GL_DEPTH_BUFFER_BIT, GL_NEAREST);

Код фрагмента для drawModelFunction ()

  glBindFramebuffer(GL_FRAMEBUFFER, fboGL); 
  glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, colorTex, 0);
  glFramebufferTexture2D(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_TEXTURE_2D, depthTex, 0);


  /*************************************/
  /* Some stuff to render the 3D Model */
  /*************************************/



Код фрагмента для printDepthFunction ()

  GLfloat *pixels = (GLfloat *)malloc(_windowWidth * _windowHeight * sizeof *pixels);

  assert(pixels);

  glBindTexture(GL_TEXTURE_2D, depthTex);
  glGetTexImage(GL_TEXTURE_2D, 0, GL_DEPTH_COMPONENT, GL_FLOAT, pixels);

  /* print the the values stored in **pixels** */

  free(pixels);
  glBindFramebuffer(GL_FRAMEBUFFER, 0);  

Когда я пытаюсь отобразить значения, хранящиеся в глубине, я получаю только одно значение «1.0f» и color возвращает мне только значение «0.0f». Кроме того, рендеринга здесь нет, так как я все смешал с FBO. У меня есть экран со смесью потока камеры, красный квадрат, вставленный в середину экрана с GUI в нем (который взял красный цвет квадрата). И никакой 3D-модели. (Это результат, который я получил после привязки фреймбуферов повсюду, как показано ранее).

...