texture(...)函数始终返回0

时间:2014-08-18 19:09:05

标签: c++ opengl glsl shader opengl-3

我一直试图让阴影贴图工作很长一段时间,而且我仍然没有比一个月前更接近。我开始认为这可能是我的GL驱动器的问题,因为我无法看到任何副作用,如“轻痤疮”。

有人告诉我开始使用sampler2DShadow代替sampler2D,这就是我所做的。但是,每当我使用texture(...)对地图进行采样时,结果始终为0.为什么会发生这种情况?

我已经尝试输入手动depthCoord值,但我仍然得到0.这可能是shadowMap本身的结果(即它的设置方式?)还是驱动程序问题?

帧缓冲设置

FramebufferName = 0;
glGenFramebuffers(1, &FramebufferName);
glBindFramebuffer(GL_FRAMEBUFFER, FramebufferName);
glGenTextures(1, &depthTexture);
glBindTexture(GL_TEXTURE_2D, depthTexture);
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_EDGE );
glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE );
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_COMPARE_FUNC, GL_LEQUAL);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_COMPARE_MODE, GL_COMPARE_REF_TO_TEXTURE);
glTexImage2D(GL_TEXTURE_2D, 0,GL_DEPTH_COMPONENT, 512, 512, 0, GL_DEPTH_COMPONENT, GL_FLOAT, 0);
glFramebufferTexture(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, depthTexture, 0);
glDrawBuffer(GL_NONE);
glReadBuffer(GL_NONE);
glBindFramebuffer(GL_FRAMEBUFFER, 0);

片段着色器

uniform sampler2DShadow shadowMap;
in vec4 depthCoord;
void main(){
    //The final color after lighting is stored as 'FinalColor'
    float visibility = 1.0;
    if (texture(shadowMap, depthCoord.xyz) == 0.0){
        visibility = 0.1;
    }
    color = vec4(finalColor.rgb * visibility, 1.0);
}

渲染代码

    glm::vec3 lightInvDir = glm::vec3(0,-10,-10);
    glm::mat4 depthProjectionMatrix = glm::ortho<float>(-10,10,-10,10,-10,20);
    glm::mat4 depthViewMatrix = glm::lookAt(lightInvDir, glm::vec3(0,0,0), glm::vec3(0,1,0));
    glm::mat4 depthModelMatrix = glm::mat4(1.0);
    glm::mat4 depthMVP = depthProjectionMatrix * depthViewMatrix * depthModelMatrix;
    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;

    /*  Shadow */
    subShader->useShader();
    glViewport(0,0,512,512);
    glUniformMatrix4fv(glGetUniformLocation(subShader->getShader(),"depthMVP"), 1, GL_FALSE, &depthMVP[0][0]);
    glBindFramebuffer(GL_FRAMEBUFFER, Shadows::framebuffer());
    renderBuffer(objBuffer);
    glBindFramebuffer(GL_FRAMEBUFFER, 0);

    /* Clear */
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

    /* Shader */
    objShader->useShader();
    glActiveTexture(GL_TEXTURE0);
    glBindTexture(GL_TEXTURE_2D, Shadows::shadowmap());
    glUniform1f(glGetUniformLocation(objShader->getShader(),"shadowMap"),0);

    /* Render Scene */
    glUniformMatrix4fv(glGetUniformLocation(objShader->getShader(),"depthBiasMVP"), 1, GL_FALSE, &depthBiasMVP[0][0]);
    glViewport(0,0,640,480);
    glUniform1f(glGetUniformLocation(objShader->getShader(),"renderingPass"),1.0);
    renderBuffer(objBuffer);

此代码的大部分内容都来自(http://www.opengl-tutorial.org/)等网站,并根据(http://www.fabiensanglard.net/shadowmapping/index.php)和红皮书进行了修改。

0 个答案:

没有答案