阴影贴图卡在1

时间:2014-10-17 19:41:29

标签: c++ opengl shadow

我正在关注http://www.opengl-tutorial.org/intermediate-tutorials/tutorial-16-shadow-mapping/上的阴影教程,我可以在渲染到屏幕对齐的四边形时查看深度纹理中的深度值。问题是当我从这个深度纹理中采样时,我只得到一个值。

这就是我设置深度纹理FBO的方法;纹理的大小设置为窗口大小。我不确定这是否是问题的一部分,但如果我将深度纹理的尺寸减半并尝试查看,我最终会看到视角的四分之一处。我以为纹理总是从[0,1]?

访问
glGenFramebuffers(1, &FramebufferName);
glBindFramebuffer(GL_FRAMEBUFFER, FramebufferName);

glGenTextures(1, &renderedTexture);
glBindTexture(GL_TEXTURE_2D, renderedTexture);
glTexImage2D(GL_TEXTURE_2D, 0,
             GL_DEPTH_COMPONENT,
             fbWidth,
             fbHeight,
             0,
             GL_DEPTH_COMPONENT,
             GL_FLOAT,
             0);

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_COMPARE_FUNC, GL_LEQUAL);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_COMPARE_MODE, GL_COMPARE_R_TO_TEXTURE);

glFramebufferTexture2D(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_TEXTURE_2D, renderedTexture, 0);
glDrawBuffer(GL_NONE);
glReadBuffer(GL_NONE);

if(glCheckFramebufferStatus(GL_FRAMEBUFFER) != GL_FRAMEBUFFER_COMPLETE)
    assert(false && "framebuffer NOT OK");

第一遍顶点着色器

#version 150 core
in vec3 position;
uniform mat4 model;

void main(){
    gl_Position = model * vec4(position,1.0);
}

第一次传递片段着色器

#version 150 core
void main(){       //letting the default gl_FragDepth assignment happen
}

第二遍顶点着色器

#version 150 core
in vec3 position;
out vec4 shadowCoord;
uniform mat4 model;
uniform mat4 camera;
uniform mat4 DepthBiasMVP;

void main() {
    gl_Position = camera * model * vec4(position, 1.0);
    shadowCoord = DepthBiasMVP * vec4(position, 1.0);
}

第二遍片段着色器:评论中出现1或0个问题,以及我尝试过的变化

#version 150 core
in vec4 shadowCoord;
uniform mat4 model;
out vec4 outColor;

//tried both types
//uniform sampler2D shadowMap;
uniform sampler2DShadow shadowMap;

void main() {
    vec3 finalColor = ...

    float visibility = 1.0;
    vec3 P = shadowCoord.xyz / shadowCoord.w;  //doesn't work
//    vec3 P =vec3(shadowCoord.x, shadowCoord.y, shadowCoord.z); //no difference
//    vec3 P = vec3(shadowCoord.xy, shadowCoord.z / shadowCoord.w); //also no difference

    visibility = texture( shadowMap, P); // always 1

//    //when shadowMap is set to sampler2D
//    vec3 textureCoord = shadowCoord.xyz/ shadowCoord.w;
//    if (texture(shadowMap, shadowCoord.xy).z ==0) //always 0
//    if (texture(shadowMap, shadowCoord.xy).x ==0) //always 1
//    if (shadowCoord.z == 0) //always 0
//        visibility = 0.06;  //

    finalColor *= visibility;
    outColor = vec4(finalColor, 1.0);
}

这就是我调用传递的方式,我正在查看的对象位于原点

glm::vec3 srcPerspective(0,0,-4);
glm::mat4 depthProjectionMatrix = glm::ortho<float>(-1,1,-1,1,-10,10);
glm::mat4 depthViewMatrix = glm::lookAt(srcPerspective, glm::vec3(0,0,0), glm::vec3(0,1,0));

//pass 1
glBindFramebuffer(GL_FRAMEBUFFER, FramebufferName);
glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glUseProgram(shadowMap.shaderProgram);
depthMVP = depthProjectionMatrix * depthViewMatrix * modelMatrix;
shadowMap.drawIndexed(world, camera, depthMVP, shapes[shipIdx].mesh.indices.data());

//pass 2
glBindFramebuffer(GL_FRAMEBUFFER, 0);
glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glActiveTexture(GL_TEXTURE0);
glBindTexture(GL_TEXTURE_2D, renderedTexture);
glm::mat4 biasMatrix(
                     0.5, 0.0, 0.0, 0.0,
                     0.0, 0.5, 0.0, 0.0,
                     0.0, 0.0, 0.5, 0.0,
                     0.5, 0.5, 0.5, 1.0
                     );
glm::mat4 depthBiasMVP = biasMatrix * depthMVP;
glUniformMatrix4fv(loc, 1, GL_FALSE, &depthBiasMVP[0][0]);
ship.drawIndexed(world, camera, lightPos, mvp, shipColor, shapes[shipIdx].mesh.indices.data());

0 个答案:

没有答案