经过3天的发现,如果没有精神上的阴影贴图,我终于到达了一个可见阴影贴图的阶段。但是现在我有一个最后的问题,在不可能的地方有一些奇怪的物体外观(至少在正常生活中)。
我在场景中绘制了3个测试对象,一个球体,一个奇怪的块状人物,以及那个块状人物的较小版本。 球体基本上最接近光线,所以你不会指望大家伙的影子出现在它上面。 小家伙在空中盘旋。 大家伙的影子位于正确的位置(他也位于世界坐标中的位置0,0,0),但在无意义的地方有球体的影子。
这是第一张图片:
第二个是我把大家伙搬到了另一个地方:
正如您在第二张图片上看到的那样,阴影也不再出现在球体上。
我绘制它们的顺序是Sphere - >大家伙 - >小家伙 在绘制每个对象之前,我还将当前的ModelView矩阵发送到着色器
Sphere s = new Sphere();
glPushMatrix();
glTranslatef(100,150,-100);
s.draw(50, 36, 36);
glPopMatrix();
glPushMatrix();
glTranslatef(-50,0,50);
glScalef(0.1f,0.1f,0.1f);
glColor3f(1f,195f/255f,0f);
drawBot();
glPopMatrix();
glPushMatrix();
glTranslatef(0,0,100);
glRotatef(180,0,1,0);
glScalef(0.01f,0.01f,0.01f);
glColor3f(0,114f/255f,1f);
drawBot();
glPopMatrix();
这是我的顶点着色器:
#version 330 core
uniform mat4 lightP, lightMV, camP, camMV, bias, curMV;
out vec4 shadowCoord;
void main()
{
gl_Position = (camP*curMV) * gl_Vertex;
gl_Position.z-=0.01;
shadowCoord = (bias*(lightP*lightMV)) * (gl_Vertex);
}
这是我的片段着色器:
#version 330 core
uniform sampler2D shadowMapTexture;
in vec4 shadowCoord;
out vec4 oColor;
float shadowMapping(){
float visibility = 0.0;
float bias = 0.01;
vec3 shadowPos = shadowCoord.xyz/shadowCoord.w;
if (texture2D( shadowMapTexture, shadowPos.xy ).z < shadowPos.z-bias){
visibility = 0.5;
}
return visibility;
}
void main(){
float shade = shadowMapping();
oColor = vec4(0,0,0,shade);
}
有没有人了解这个谜语?