我已经使用FBO和GLSL实现了shadowmapping。 它用于高度场。这是一些物体(树木,植物......)在高地上投下阴影。
我遇到的问题是阴影只能在高度场的地面上看到。也就是说,高度场的高度= 0.只要涉及一些高度,阴影就会消失。如果我看看阴影贴图本身,一切看起来都很好......离光线较近的物体较暗。
这是我的GLSL顶点着色器:
uniform mat4 lightView, lightProjection;
const mat4 biasMatrix = mat4( 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); //bias from [-1, 1] to [0, 1]
void main()
{
gl_Position = ftransform();
mat4 shadowMatrix = biasMatrix * lightProjection * lightView;
shadowTexCoord = shadowMatrix * gl_Vertex;
}
fragmentshader:
uniform sampler2DShadow shadowmap;
varying vec4 shadowTexCoord;
void main()
{
vec4 shadow = shadow2DProj(shadowmap, shadowTexCoord, 0.0);
float colorshadow = shadow.r < 0.1 ? 0.5 : 1.0;
vec4 color = vec4(1,1,1,1);
gl_FragColor = vec4( color*colorshadow, color.w );
}
非常感谢你对此有任何帮助!
答案 0 :(得分:2)
我认为这里的不同空间之间可能存在一些混淆。如上所述,看起来您的代码仅在地面的gl_ModelViewMatrix
仅包含相机变换时才有效。这是因为ftransform
基本上是
gl_Position = gl_ProjectionMatrix * (gl_ModelViewMatrix * gl_Vertex)
表示在对象坐标中指定gl_Vertex
。然而,通常光照的视图矩阵从世界坐标映射到光的视图空间,因此该代码仅在对象空间=世界空间时才起作用。所以基本上,让我们说你缩放地形,然后对象空间不再等于世界空间。因此,您需要将gl_ModelViewMatrix
分成两部分:摄像机视图矩阵和建模变换(例如对象 - &gt;世界空间)
我还没有测试过这段代码,但我会尝试这样的事情:
uniform mat4 lightView, lightProjection;
uniform mat4 camView, camProj, modelTrans;
const mat4 biasMatrix = mat4( 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); //bias from [-1, 1] to [0, 1]
void main()
{
mat4 modelViewProjMatrix = camProj * camView * modelTrans;
gl_Position = modelViewProjMatrix * gl_Vertex;
mat4 shadowMatrix = biasMatrix * lightProjection * lightView * modelTrans;
shadowTexCoord = shadowMatrix * gl_Vertex;
}
从技术上讲,将CPU上的矩阵相乘并且只传递你需要的精确矩阵会更快,但是为了让东西工作有时更容易做到这一点。
答案 1 :(得分:0)
也许你只是错过了复制粘贴,但我没有看到shadowTexCoord在顶点着色器中变化。但是,这会导致编译错误。