阴影贴图绘制

时间:2014-10-31 23:57:28

标签: java opengl glsl shader shadow

经过3天的发现,如果没有精神上的阴影贴图,我终于到达了一个可见阴影贴图的阶段。但是现在我有一个最后的问题,在不可能的地方有一些奇怪的物体外观(至少在正常生活中)。

我遇到的问题是:

我在场景中绘制了3个测试对象,一个球体,一个奇怪的块状人物,以及那个块状人物的较小版本。 球体基本上最接近光线,所以你不会指望大家伙的影子出现在它上面。 小家伙在空中盘旋。 大家伙的影子位于正确的位置(他也位于世界坐标中的位置0,0,0),但在无意义的地方有球体的影子。

这是第一张图片:

First

第二个是我把大家伙搬到了另一个地方:

Second

正如您在第二张图片上看到的那样,阴影也不再出现在球体上。

我绘制它们的顺序是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);
}

有没有人了解这个谜语?

0 个答案:

没有答案