Кадровый буфер не рендерит глубину в глубину текстуры - PullRequest
0 голосов
/ 28 июня 2019

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

IЯ использую OpenGL, я не знаю, где может быть ошибка, но при анализе захвата с помощью RenderDoc, он говорит, что FBO (FrameBufferObject) не используется, а также интерпретирует то, что должно быть моим 1-м проходом, проходом только на глубину, какцветной проход.

/*-This is how I create the FBO and the texture to render the depth-*/

glEnable(GL_DEPTH_TEST);
glDepthFunc(GL_LESS);

// Create texture for Depth image (first pass)
glGenTextures(1, &depthTexture);
glBindTexture(GL_TEXTURE_2D, depthTexture);

// Give pixel data to opengl
glTexImage2D(GL_TEXTURE_2D, 0, GL_DEPTH_COMPONENT, 1024, 1024, 0, GL_DEPTH_COMPONENT, GL_UNSIGNED_BYTE, nullptr);


// WITH PCF for anti-aliasing shadow edges 
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);



glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_BORDER);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_BORDER);

glGenFramebuffers(1, &FBO);
glBindFramebuffer(GL_FRAMEBUFFER, FBO);
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_TEXTURE_2D,     
depthTexture, 0);
glDrawBuffer(GL_NONE);
glReadBuffer(GL_NONE);

glBindFramebuffer(GL_FRAMEBUFFER, 0);
/*---------------------------END------------------------------------*/

/*---This is how I render all the objects (1st and second pass)-----*/
glViewport(0, 0, 1024, 1024);

glClearColor(0.3f, 0.3f, 0.3f, 1.0f);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

cube.FirstPass(light.getPos());
plane.FirstPass(light.getPos());
cone1.FirstPass(light.getPos());
cone2.FirstPass(light.getPos());

glFlush();
glFinish();

glViewport(0, 0, WIDTH, HEIGHT);
glClearColor(0.3f, 0.3f, 0.3f, 1.0f);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

cube.display(&cam, light.getPos());
plane.display(&cam, light.getPos());
viewport.display(&cam, light.getPos());
cone1.display(&cam, light.getPos());
cone2.display(&cam, light.getPos());
/*---------------------------END------------------------------------*/

/*---------This is how I do First Pass---------*/
//Here goes first pass
glBindFramebuffer(GL_FRAMEBUFFER, sceneManager.getFBO());

glClear(GL_DEPTH_BUFFER_BIT);    

glUseProgram(DepthPass.shader);

glm::mat4 mtx = glm::perspective(glm::radians(60.0f), 1024.0f / 1024.0f,          5.0f, 40.0f);

DepthPass.setMat("M", mtx * glm::lookAt(glm::vec3(lightPos.x, lightPos.y, lightPos.z), glm::vec3(0.0, 0.0, 0.0), glm::vec3(0.0, 1.0, 0.0)) *             
getModelToWorld());

glBindVertexArray(vao);

// Draw
glDrawArrays(GL_TRIANGLES, 0, ModelVertices.size());


glBindFramebuffer(GL_FRAMEBUFFER, 0);
/*---------------------------END------------------------------------*/

/*--This is what I pass to the shader that shows the depth texture--*/
DepthPass.setFloat("near", 5.0f);
DepthPass.setFloat("far", 40.0);

DepthPass.setInt("IsViewport", 1);

glActiveTexture(GL_TEXTURE0);

//GetDepthTexture() returns a handle of the texture created before

glBindTexture(GL_TEXTURE_2D, sceneManager.GetDepthTexture());
std::string textureName = "depthTexture";
DepthPass.setInt(textureName.c_str(), sceneManager.GetDepthTexture());

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