FBO и текстуры - PullRequest
       102

FBO и текстуры

0 голосов
/ 25 февраля 2019

Я прикрепил две текстуры к FBO.Первая текстура будет использоваться для отображения карты глубины.Вторая текстура будет отображать объект обычным способом.

Если я это сделаю, он будет работать хорошо и покажет мне карту глубины.

GLuint atach0 = GL_DEPTH_ATTACHMENT;
glBindFramebuffer(GL_FRAMEBUFFER,fboBuffer);
  glDrawBuffers(1,&atach0);
  glClear(GL_DEPTH_BUFFER_BIT);
  glViewport(0.0,0.0,640,480);
  LProjection = glm::ortho(-10.0f,10.0f,-10.0f,10.0f,-500.0f,500.0f);
  LView = glm::lookAt(glm::vec3(0.0f,15.0f,0.000001f),glm::vec3(0.0f,0.0f,0.0f),glm::vec3(0.0f,1.0f,0.0f));
  LViewProjection = LProjection * LView;
  glEnable(GL_DEPTH_TEST);

  ...CUBE3D

glBindFramebuffer(GL_FRAMEBUFFER,0);

glUniform1i(uniforTEX,0);
glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_2D,GL_DEPTH_MAP);

  ...DRAW-DEPTH-MAP!

glBindTexture(GL_TEXTURE_2D,0);

Но если я сделаю это, то толькопоказывает белый экран и карта глубины больше не видна.

GLuint atach0 = GL_DEPTH_ATTACHMENT;
glBindFramebuffer(GL_FRAMEBUFFER,fboBuffer);
  glDrawBuffers(1,&atach0);
  glClear(GL_DEPTH_BUFFER_BIT);
  glViewport(auxrecX,auxrecY,auxrcAn,auxrcAl);
  LProjection = glm::ortho(-10.0f,10.0f,-10.0f,10.0f,-500.0f,500.0f);
  LView = glm::lookAt(glm::vec3(0.0f,15.0f,0.000001f),glm::vec3(0.0f,0.0f,0.0f),glm::vec3(0.0f,1.0f,0.0f));
  LViewProjection = LProjection * LView;
  glEnable(GL_DEPTH_TEST);

  ...CUBE3D

glBindFramebuffer(GL_FRAMEBUFFER,0);

GLuint atach1 = GL_COLOR_ATTACHMENT0;
glBindFramebuffer(GL_FRAMEBUFFER,fboBuffer);
  glDrawBuffers(1,&atach1);
  glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
  glViewport(0,0,640,480);
  Projection = glm::perspective(45.0f,1.333333f,0.01f,1000.0f);
  View = glm::lookAt(glm::vec3(0.0f,0.0f,3.0),glm::vec3(0.0f,0.0f,-15.0f),glm::vec3(0.0f,1.0f,0.0f));
  ViewProjection = Projection * View;
  glEnable(GL_DEPTH_TEST);

  ...CUBE3D

glBindFramebuffer(GL_FRAMEBUFFER,0);   

glUniform1i(uniforTEX,0);
glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_2D,GL_DEPTH_MAP);

  ...DO NOT DRAW NOTHING

glBindTexture(GL_TEXTURE_2D,0);

Мне нужно сделать это в таком порядке.Потому что первый «проход» предназначен для использования карты глубины на карте теней.Что я делаю не так?

1 Ответ

0 голосов
/ 25 февраля 2019

GL_DEPTH_ATTACHMENT недопустимо для glDrawBuffers.glDrawBuffers буферов, в которые будут записываться выходные данные данных фрагментного шейдера.

Когда вы выполните

GLuint atach0 = GL_DEPTH_ATTACHMENT;
glBindFramebuffer(GL_FRAMEBUFFER,fboBuffer);

, вы получите ошибку GL_INVALID_ENUM.

Если вы не хотите подключаться к карте глубины, отключите тест глубины использования glDepthMask.Вложение буфера глубины не может быть включено и выключено, и его нельзя использовать как-то как буфер цвета.

Далее

glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

очиститБуфер глубины в любом случае.

Я думаю, что есть основное недоразумение, как должны быть установлены кадровые буферы для карты теней.Вам понадобится кадровый буфер только для карты теней.Этот кадровый буфер должен иметь только буфер глубины.

Вы должны сделать что-то вроде этого:

GLuint fboShadow;      // framebuffer with depth buffer only (shadow map)
GLuint toShadowDepth;  // texture which is the depth buffer of `fboShadow`
glBindFramebuffer(GL_FRAMEBUFFER, fboShadow);
GLuint atach0 = GL_NONE;
glDrawBuffers(1, &atach0);
glClear(GL_DEPTH_BUFFER_BIT);

glEnable(GL_DEPTH_TEST);
glViewport(auxrecX, auxrecY, auxrcAn, auxrcAl);

// draw the shadow map to the depth buffer only

glBindFramebuffer(GL_FRAMEBUFFER, 0);
glClear(GL_DEPTH_BUFFER_BIT | GL_COLOR_BUFFER_BIT);

glEnable(GL_DEPTH_TEST);
glViewport(0, 0, 640, 480);

glUniform1i(uniforTEX, 0);
glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_2D, toShadowDepth);

// draw the geometry to the default framebuffer by using the depth map
...