GLSL软平面阴影:矩阵变换

时间:2015-01-31 18:26:25

标签: opengl matrix glsl shadow affinetransform

我正在向older video game engine添加一些适度的功能。它有简单的平面阴影,使用模板缓冲区和projection matrix popularized in SGI's cookbook年前。

Not half bad looking But if the shadow could fade out with the light's radius..

这些工作相当不错,除了它们不会根据光源的衰减而衰减强度。这就是我想在着色器中完成的事情。不幸的是,我无法弄清楚允许这种正确的转换。这是我的着色器源代码。我坚持使用#version 120

编辑:现在是更新后的着色器

/*
 * @brief Planar shadows vertex shader.
 */

#version 120

uniform mat4 MATRIX;

varying vec4 point;

/*
 * @brief
 */
void ShadowVertex() {

    point = gl_ModelViewMatrix * MATRIX * gl_Vertex;    
}

/*
 * @brief Program entry point.
 */
void main(void) {

    // mvp transform into clip space
    gl_Position = gl_ModelViewProjectionMatrix * MATRIX * gl_Vertex;

    // and primary color
    gl_FrontColor = gl_Color;

    ShadowVertex();
}
/*
 * @brief Planar shadows fragment shader.
 */

#version 120

uniform vec4 LIGHT;

varying vec4 point;

/*
 * @brief
 */
void ShadowFragment(void) {

    float dist = distance(LIGHT.xyz, point.xyz / point.w);

    float intensity = (LIGHT.w - dist) / LIGHT.w;

    if (intensity <= 0.0)
        discard;

    gl_FragColor.a = min(gl_Color.a, intensity);
}

/*
 * @brief Program entry point.
 */
void main(void) {

    gl_FragColor = gl_Color;

    ShadowFragment();
}

MATRIX是平面阴影教程中的投影矩阵。阴影的形状是正确的,所以我不相信那里有任何问题。我知道这不是一个仿射变换,但我不清楚它的含义。

LIGHT.xyz是眼睛空间中光源的坐标。 LIGHT.w是光的半径(衰减)。我感到困惑的是如何在片段着色器中从lightpoint进行有意义的比较 - 或者真的,为什么我在那里尝试的是错误的。我最终没有阴影;换句话说,计算出的intensity值始终为<= 0.0

1 个答案:

答案 0 :(得分:1)

Freenode上## OpenGL的有用社区成员指出了我的错误。由于投影矩阵MATRIX不产生仿射变换,我需要将距离计算除以point.w。这会产生LIGHT.xyzpoint.xyz之间的正确距离。

简而言之,如果你正在使用这样的投影矩阵,请确保你了解如何处理所有4个坐标组件,或者知道要问谁:)