OpenGL:ShadowMapping:仅在y = 0时可见的阴影

时间:2009-04-29 18:22:27

标签: opengl

我已经使用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 );  

}

非常感谢你对此有任何帮助!

2 个答案:

答案 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在顶点着色器中变化。但是,这会导致编译错误。