2017-02-12 98 views
-1

我一直在试图实现阴影映射到我的OpenGL引擎SFML 2.2,他们似乎没有渲染正确。我相信我将问题缩小到用于计算阴影的正投影。OpenGL正投影与渲染阴影的问题

/* before the main loop, creating the depth buffer for shadow mapping */ 
glm::vec3 lightPos(glm::vec3(-45.f, 45.f, -40.f)); 

const GLuint SHADOW_WIDTH = 1024, SHADOW_HEIGHT = 1024; 
GLuint depthMapFBO; 
glGenFramebuffers(1, &depthMapFBO); 

GLuint depthMap; 
glGenTextures(1, &depthMap); 
glBindTexture(GL_TEXTURE_2D, depthMap); 

glTexImage2D(GL_TEXTURE_2D, 0, GL_DEPTH_COMPONENT, SHADOW_WIDTH, SHADOW_HEIGHT, 0, GL_DEPTH_COMPONENT, GL_FLOAT, NULL); 
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); 
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); 
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_BORDER); 
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_BORDER); 
GLfloat borderColor[] = { 1.0, 1.0, 1.0, 1.0 }; 
glTexParameterfv(GL_TEXTURE_2D, GL_TEXTURE_BORDER_COLOR, borderColor); 

glBindFramebuffer(GL_FRAMEBUFFER, depthMapFBO); 
glFramebufferTexture2D(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_TEXTURE_2D, depthMap, 0); 
glDrawBuffer(GL_NONE); 
glReadBuffer(GL_NONE); 
glBindFramebuffer(GL_FRAMEBUFFER, 0); 

glClearColor(0.1f, 0.1f, 0.1f, 1.0f); 

/* in the main loop, sending information to the appropiate shaders and setting viewports */ 
glm::mat4 lightProjection, lightView; 
glm::mat4 lightSpaceMatrix; 
GLfloat near_plane = 1.f, far_plane = 300.f; 
lightProjection = glm::ortho(-10.f, 10.f, -10.f, 10.f, near_plane, far_plane); 
lightView  = glm::lookAt(lightPos, glm::vec3(0.0f), glm::vec3(0.0, 1.0, 0.0)); 
lightSpaceMatrix = lightProjection * lightView; 

glUseProgram(simpleDepthShader); 
glUniformMatrix4fv(glGetUniformLocation(simpleDepthShader, "lightSpaceMat"), 1, GL_FALSE, glm::value_ptr(lightSpaceMatrix)); 
glViewport(0, 0, SHADOW_WIDTH, SHADOW_HEIGHT); 
glBindFramebuffer(GL_FRAMEBUFFER, depthMapFBO); 
    glClear(GL_DEPTH_BUFFER_BIT); 
    RenderScene(); 
glBindFramebuffer(GL_FRAMEBUFFER, 0); 

// reset viewport, and display the scene as normal 
glViewport(0, 0, window.getSize().x, window.getSize().y); 
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); 

glUniform3fv(glGetUniformLocation(lightingShader, "lightPos_shade"), 1, &lightPos[0]); 
glUniform3fv(glGetUniformLocation(lightingShader, "viewPos"), 1, &getPos()[0]); 
glUniformMatrix4fv(glGetUniformLocation(lightingShader, "lightSpaceMat"), 1, GL_FALSE, glm::value_ptr(lightSpaceMatrix)); 
glActiveTexture(GL_TEXTURE1); 
glBindTexture(GL_TEXTURE_2D, depthMap); 

RenderScene(); 

我已将视图和投影矩阵应用于相机以查看光线所见,以及this was the result (along with the view from the depth buffer)

这里的景象是什么样子with the shadows(这对于失速的阴影甚至不投射到自身出于某种原因)。

回答

0

看来你的着色器不能正确读取你的影子像素。

当您改造顶点与光矩阵他们在[-1,1]范围内,但是纹理采样是在范围[0,1]。

http://www.opengl-tutorial.org/intermediate-tutorials/tutorial-16-shadow-mapping/

+0

它们转化成的范围[0,1],它不仅增加了阴影的大小。这个问题与我认为的投影有关,因为第一张图片底部的深度缓冲区看起来很奇怪(大多是黑色)。虽然我可以尝试这个阴影贴图的例子,但也许我会有更多的运气。 – Inzuki