延迟渲染阴影奇怪的行为(几乎工作,而不是粉刺)

时间:2016-05-24 17:19:31

标签: c++ opengl glsl shadow-mapping

我有一个简单的延迟渲染设置,我正在尝试让深度贴图阴影起作用。我知道我的代码中有一个简单的错误,因为我可以看到阴影工作,但是当我移动相机时它们似乎会移动并失去分辨率。这不是阴影痤疮问题。阴影完全转移。我在这里也看到了大部分类似的问题,但没有一个能解决我的问题。

在我的最终着色器中,我有一个纹理用于​​像素的世界空间位置,以及从光源渲染的深度图,以及光源的模型 - 视图 - 投影矩阵。我采取的步骤是:

  1. 从预渲染过程中获取像素的世界空间位置。
  2. 将世界空间位置与光源的模型 - 视图 - 投影矩阵相乘。我正在使用正交投影(定向光)。

    <tr>
        <td id="col-action">
            <div class="prix">
                <span id="panier_prix_326">99.40</span>
                <div id="prix-detail">MSRP: 152.93$</div>
            </div>
        </td>
    </tr>
    
  3. 我将定向灯放在我英雄周围的固定距离处。以下是我获取灯光模型视图矩阵的方法:

    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    glOrtho(-0.0025, 0.0025, -0.0025, 0.0025, -0.1, 0.1);
    glGetFloatv(GL_PROJECTION_MATRIX,m_lightViewProjectionMatrix);
    

    最终的光mvp矩阵是:

    CSRTTransform lightTrans = CSRTTransform(); 
    CVector camOffset = CVector(m_vPlanet[0].m_vLightPos);
    camOffset.Normalize();
    camOffset *= 0.007;
    camOffset += hero.GetLocation();
    
    CVector LPN = m_vLightPos*(-1); LPN.Normalize();
    CQuaternion lRot;
    lRot = CQuaternion( CVector(0,1,0), asin(LPN | CVector(-1,0,0) ) );
    lightTrans.m_qRotate = lRot;
    lightTrans.m_vTranslate = camOffset;
    m_worldToLightViewMatrix = lightTrans.BuildViewMatrix();
    

    现在我只在阴影传递中渲染阴影脚轮。如你所见,阴影传递似乎很好,我的英雄在框架中居中并正确旋转。值得注意的是,这两个矩阵被传递给英雄的顶点着色器,因此似乎就像它们是正确的一样,因为英雄在阴影传递中正确渲染(此处显示的可见性更具对比度)

    https://lh3.googleusercontent.com/-pxBZ5jnmlfM/V0SBT75yB1I/AAAAAAAABEY/007j_toVO7M41iyEiEnJgvr7K1m5GSceQCCo/s1024/shadow_pass.jpg

    最后,在我的延迟着色器中,我做了:

    CMatrix4 lightMVPMatrix = m_lightViewProjectionMatrix * m_worldToLightViewMatrix;       
    m_shHDR.SetUniformMatrix("LightMVPMatrix", lightMVPMatrix);
    

    我有/ w部门注释掉了,因为我正在使用正交投影。无论如何,让它产生相同的结果。

    https://lh3.googleusercontent.com/-b2i7AD_Nnf0/V0SGPyfelsI/AAAAAAAABFE/mvWnhcdQSbsU3l8sd0974jWDA94r6PkxACCo/s1024/render3.jpg

    在我的英雄的某些位置(接近初始位置)(1),阴影看起来很好。但是当我移动英雄时,阴影移动不正确(2),并且我移动越远,阴影开始失去分辨率(3)。

    值得注意的是我的所有纹理和传递都是相同的大小(1280x720)。我正在使用NVidia显卡。这个问题似乎与矩阵有关,但如上所述,阴影传递渲染正常,所以我不确定发生了什么......

0 个答案:

没有答案