2013-04-01 8 views
4

기본 그림자 맵을 만들려고하고 있는데 어떤 이유로 그것이 올바르게 렌더링되지 않습니다. 난 단지 집 렌더링OpenGL Shadow Map

int shadowMapWidth = WINDOW_SIZE_X * (int)SHADOW_MAP_RATIO; 
int shadowMapHeight = WINDOW_SIZE_Y * (int)SHADOW_MAP_RATIO; 

// Rendering into the shadow texture. 
glActiveTexture(GL_TEXTURE0); 
CALL_GL(glBindTexture(GL_TEXTURE_2D, shadowTexture)); 
// Bind the framebuffer. 
CALL_GL(glBindFramebuffer(GL_FRAMEBUFFER, shadowFBO)); 
//Clear it 
CALL_GL(glClear(GL_DEPTH_BUFFER_BIT)); 
CALL_GL(glViewport(0, 0, shadowMapWidth, shadowMapHeight)); 
CALL_GL(glColorMask(GL_FALSE, GL_FALSE, GL_FALSE, GL_FALSE)); 
//Render stuff 
flatShader.use(); 
flatShader["baseColor"] = glm::vec4(1.0f,1.0f,1.0f,1.0f); 
flatShader["pvm"] = projectionMatrix*pointLight.viewMatrix*cursor.modelMatrix; 
cursor.draw(); //binds the vao and draws 

// Revert for the scene. 
CALL_GL(glBindFramebuffer(GL_FRAMEBUFFER, 0)); 
CALL_GL(glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE)); 
CALL_GL(glViewport(0, 0, WINDOW_SIZE_X, WINDOW_SIZE_Y)); 

주의 사항 :

Video of the Problem

나는 플랫 쉐이더를 사용하여 집안을 렌더링합니다. 나는 depth-buffer pass에 floor를 렌더링하지 않는다.

/* [VERT] */ 
#version 330 

in vec3 in_Position; 
in vec2 in_TexCoord; 

uniform mat4 shadowMatrix; 
uniform mat4 mvp; 

out vec2 UV; 
out vec4 shadowProj; 

void main() 
{ 
    gl_Position = mvp*vec4(in_Position,1.0); 
    shadowProj = shadowMatrix*vec4(in_Position,1.0); 
    UV = in_TexCoord; 
} 

그리고 조각 쉐이더 :

이 다음 나는 다음과 같은 쉐이더 쌍을 사용하여 바닥을 나타내는 쿼드 렌더링

/* [FRAG] */ 
#version 330 

in vec2 UV; 
in vec4 shadowProj; 

out vec4 fragColor; 

uniform sampler2D texturex; 
uniform sampler2DShadow shadowMap; 

void main() 
{ 
    fragColor = vec4(texture(texturex, UV).rgb,1); 

    float shadow = 1.0; 
    shadow = textureProj(shadowMap,shadowProj); 

    fragColor *= shadow; 

} 

내가 다음 색상과 다시 집을 그릴을 .. 층 :

textureShader.use(); 

glUniform1i(baseImageLoc, 0); //Texture unit 0 is for base images. 
glUniform1i(shadowMapLoc, 1); //Texture unit 1 is for shadow maps. 

glActiveTexture(GL_TEXTURE0); 
glBindTexture(GL_TEXTURE_2D, floorTexture); 

glActiveTexture(GL_TEXTURE1); 
glBindTexture(GL_TEXTURE_2D, shadowTexture); 
textureShader["shadowMatrix"] = projectionMatrix*pointLight.viewMatrix*floorMatrix; 
textureShader["mvp"] = projectionMatrix*viewMatrix*floorMatrix; 
CALL_GL(glBindVertexArray(floorVAO)); 
CALL_GL(glDrawArrays(GL_TRIANGLES,0,18)); 

glfwSwapBuffers(); 

누구든지 이전에이 동작을 보았습니까? 어떤 생각이 잘못 될 수 있습니까? 그런데 빛의 코디네이터는 집 바로 위에 놓기 때문에 그림자는 바닥에있는 집 바로 아래에 있어야합니다 (그러나 그것은 옆으로 끝납니다). 당신은 바이어스 행렬하여 그림자 행렬을 곱 깜빡처럼 보이는

int shadowMapWidth = WINDOW_SIZE_X * (int)SHADOW_MAP_RATIO; 
int shadowMapHeight = WINDOW_SIZE_Y * (int)SHADOW_MAP_RATIO; 

glGenTextures(1, &shadowTexture); 
glBindTexture(GL_TEXTURE_2D, shadowTexture); 
glTexImage2D(GL_TEXTURE_2D, 0, GL_DEPTH_COMPONENT, shadowMapWidth, shadowMapHeight, 0, GL_DEPTH_COMPONENT, GL_UNSIGNED_BYTE, 0); 
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); 
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); 
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); 
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_COMPARE_MODE, GL_COMPARE_REF_TO_TEXTURE); 
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_COMPARE_FUNC, GL_LESS); 
glTexImage2D(GL_TEXTURE_2D,0,GL_DEPTH_COMPONENT,shadowMapWidth,shadowMapHeight,0,GL_DEPTH_COMPONENT,GL_FLOAT,NULL); 
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_COMPARE_MODE,GL_COMPARE_R_TO_TEXTURE); 
glBindTexture(GL_TEXTURE_2D, 0); //unbind the texture 

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

if (glCheckFramebufferStatus(GL_FRAMEBUFFER) != GL_FRAMEBUFFER_COMPLETE) 
{ printf("GL_FRAMEBUFFER_COMPLETE error 0x%x", glCheckFramebufferStatus(GL_FRAMEBUFFER)); } 

glClearDepth(1.0f); glEnable(GL_DEPTH_TEST); 
// Needed when rendering the shadow map. This will avoid artifacts. 
glPolygonOffset(1.0f, 0.0f); glBindFramebuffer(GL_FRAMEBUFFER, 0); 
//to convert the texture coordinates to -1 ~ 1 
    GLfloat biasMatrixf[] = { 
    0.5f, 0.0f, 0.0f, 0.0f, 
    0.0f, 0.5f, 0.0f, 0.0f, 
    0.0f, 0.0f, 0.5f, 0.0f, 
    0.5f, 0.5f, 0.5f, 1.0f }; 

biasMatrix = glm::make_mat4(biasMatrixf); 

답변

2

: 여기에 참고로

내가 그림자 FBO를 생성하는 방법이다.

+2

감사합니다 !!! 그게 문제 였어! 또한 바이어스 매트릭스가 잘못되었습니다. 0.5f는 맨 아래 열에 있어야하며, 맨 오른쪽 열에 있지 않아야합니다 (이를 반영하기 위해 코드를 편집했습니다). GLfloat biasMatrixf [] = { 0.5F,은 0.0f, 0.0f를,은 0.0f, 0.0f를 , 0.5F,은 0.0f, 0.0f를, 은 0.0f, 0.0f를, 0.5F, 0.0f를, 0.5F , 0.5f, 0.5f, 1.0f}; – Jubei

+0

좋은 작품입니다. 당신의 작은 집은 친절하게 보입니다. :). 그림자 맵핑은해야 할 일 목록 중 하나입니다. 실제로 그것을 두려워합니다. – Robinson