ShadowMap混淆了

时间:2013-01-09 16:06:45

标签: opengl shadow-mapping

我对阴影贴图很困惑。这是我所理解的(下面的步骤不起作用:))

如何获取利润(请不要对代码感到困惑,这大致是因为我在Java上写的):

1。使用参数创建空的depthTexture(我的是1024x1024)

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_COMPARE_MODE, GL_COMPARE_R_TO_TEXTURE)

glTexImage2D(GL_TEXTURE_2D, 0, GL_DEPTH_COMPONENT, width, height, 0, GL_DEPTH_COMPONENT, GL_FLOAT, GL_NULL)

2。创建FBO并将该纹理附加到

glFramebufferTexture(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, depthTexture, 0)

3. 为照明相机设置新的投影和视图矩阵

我使用与我的主相机相同的另一个coords,因为场景看起来更好(我尝试了,所以没有问题...... 我猜 ..)。

4. 创建新的小着色器以确定FBO的gl_Position并使用花哨的东西修改主着色器(偏置矩阵* lightCamera矩阵*顶点,sampler2Dshadow等)

5. 当然要统一一切并做点什么。

现在 RENDER LOOP

1。当然要统一所有事情并再做一些事情。

2. 绑定FBO,绑定小着色器,glViewport(0, 0, 1024, 1024),colorMask为false,清除深度缓冲区,glCullFace(GL_FRONT)glBindTexture(GL_TEXTURE_2D, 0)

3。只使用顶点位置渲染所有内容完全没有任何内容

4. 取消绑定FBO,将程序重新绑定到主着色器(那个有花哨的东西),glViewport,启用colorMask,glCullFace(GL_BACK)

5. 正常渲染场景,甚至没有想到“地狱主要着色器会如何得到sampler2DShadow因为我们不绑定它,不要使它均匀,甚至不要触摸它“

6。观看无数毛刺,错误和像素狂欢

实际上我试着将depthTexture统一到采样器,但我只有黑屏。即使我不渲染FBO,当我这样做时,我也会得到相同的图片。

有人可以解释一下,我错过了什么?

我觉得shader使用漫反射纹理两次:作为漫反射纹理和作为depthTexture,但我不知道如何赋予它deepTexture。

1 个答案:

答案 0 :(得分:4)

这是一个很好的链接:http://www.opengl-tutorial.org/intermediate-tutorials/tutorial-16-shadow-mapping/

和这里:http://www.paulsprojects.net/tutorials/smt/smt.html(虽然第二个链接使用旧的固定函数opengl)

一般来说:

  1. 创建一个深度纹理
  2. 将此纹理附加到FBO
  3. 绑定FBO,设置正确的视口
  4. 从光pos渲染场景,仅将深度值保存到纹理
  5. 取消绑定FBO并设置最终场景视频和摄像机位置
  6. 使用阴影测试(sampler2DShadow)正常渲染场景
  7. 您可以始终渲染深度贴图(在渲染循环中)或仅在光线变化时渲染。

    我不知道你为什么通常两次渲染你的场景......你使用的是Z-prepass,还是什么?试试我认为的基本版本。

    带阴影贴图的旧代码:

    void RenderShadowMap() {
        currDepth->Bind();
        glClear(GL_DEPTH_BUFFER_BIT);
        glMatrixMode(GL_PROJECTION);
        glLoadIdentity();
        gLightCam.SetProjectionMatrix();
        glMatrixMode(GL_MODELVIEW);
        glLoadIdentity();
        gLightCam.SetViewMatrix();
    
        glColorMask(false, false, false, false);
        glUseProgram(0);   // draw without any shaders... just default depth
        glEnable(GL_POLYGON_OFFSET_FILL);
        glPolygonOffset(offFactor, offUnits);
        SimpleScene(false); // floor does not cast shadow so do not render it
        glDisable(GL_POLYGON_OFFSET_FILL);
        glColorMask(true, true, true, true);
    }
    

    渲染场景:

    // compose shadow matrix:
    MATRIX4X4 bias(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);
    MATRIX4X4 *invCam = gSphericalCam.GetInvViewMatrix();
    MATRIX4X4 smMat = (*gLightCam.GetViewProjMatrix()) * (*invCam);
    
    gShaderProgramManager->GetProgram("shadow")->Use();
    gShaderProgramManager->GetProgram("shadow")->SetMatrix("shadowMat", &smMat);
    gShaderProgramManager->GetProgram("shadow")->SetBool("useShadow", currCam != &gLightCam && useShadow);
    gShaderProgramManager->GetProgram("shadow")->SetFloat("shadowMapSize", (float)currDepth->GetWidth());
    glActiveTexture(GL_TEXTURE0);
    glEnable(GL_TEXTURE_2D);
    glColor3f(1.0f, 1.0f, 1.0f);
    gTextureManager->Bind("default");
    glActiveTexture(GL_TEXTURE1);
    currDepth->BindDepthAsTexture();
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_COMPARE_MODE_ARB, GL_COMPARE_R_TO_TEXTURE_ARB);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_COMPARE_FUNC_ARB, GL_LEQUAL);
    
    SimpleScene();