我有一个简单的延迟渲染设置,我正在尝试让深度贴图阴影起作用。我知道我的代码中有一个简单的错误,因为我可以看到阴影工作,但是当我移动相机时它们似乎会移动并失去分辨率。这不是阴影痤疮问题。阴影完全转移。我在这里也看到了大部分类似的问题,但没有一个能解决我的问题。
在我的最终着色器中,我有一个纹理用于像素的世界空间位置,以及从光源渲染的深度图,以及光源的模型 - 视图 - 投影矩阵。我采取的步骤是:
将世界空间位置与光源的模型 - 视图 - 投影矩阵相乘。我正在使用正交投影(定向光)。
<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>
我将定向灯放在我英雄周围的固定距离处。以下是我获取灯光模型视图矩阵的方法:
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();
现在我只在阴影传递中渲染阴影脚轮。如你所见,阴影传递似乎很好,我的英雄在框架中居中并正确旋转。值得注意的是,这两个矩阵被传递给英雄的顶点着色器,因此似乎就像它们是正确的一样,因为英雄在阴影传递中正确渲染(此处显示的可见性更具对比度)
最后,在我的延迟着色器中,我做了:
CMatrix4 lightMVPMatrix = m_lightViewProjectionMatrix * m_worldToLightViewMatrix;
m_shHDR.SetUniformMatrix("LightMVPMatrix", lightMVPMatrix);
我有/ w部门注释掉了,因为我正在使用正交投影。无论如何,让它产生相同的结果。
在我的英雄的某些位置(接近初始位置)(1),阴影看起来很好。但是当我移动英雄时,阴影移动不正确(2),并且我移动越远,阴影开始失去分辨率(3)。
值得注意的是我的所有纹理和传递都是相同的大小(1280x720)。我正在使用NVidia显卡。这个问题似乎与矩阵有关,但如上所述,阴影传递渲染正常,所以我不确定发生了什么......