2017-02-12 130 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