帧缓冲区未将深度渲染到深度纹理中

时间:2019-06-28 15:30:40

标签: c++ opengl

因此,我分配了有关两次通过渲染以计算阴影的任务,我正在尝试存储场景中每个对象的深度值,并将其作为纹理渲染到另一个对象中。

我正在使用OpenGL,我真的不知道错误可能在哪里,但是当使用RenderDoc分析捕获时,它说FBO(FrameBufferObject)未使用,并且还解释了我的第一遍,深度仅通过,作为彩色通过。

/*-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------------------------------------*/

0 个答案:

没有答案