我正在向older video game engine添加一些适度的功能。它有简单的平面阴影,使用模板缓冲区和projection matrix popularized in SGI's cookbook年前。
这些工作相当不错,除了它们不会根据光源的衰减而衰减强度。这就是我想在着色器中完成的事情。不幸的是,我无法弄清楚允许这种正确的转换。这是我的着色器源代码。我坚持使用#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
是光的半径(衰减)。我感到困惑的是如何在片段着色器中从light
到point
进行有意义的比较 - 或者真的,为什么我在那里尝试的是错误的。我最终没有阴影;换句话说,计算出的intensity
值始终为<= 0.0
。
答案 0 :(得分:1)
Freenode上## OpenGL的有用社区成员指出了我的错误。由于投影矩阵MATRIX
不产生仿射变换,我需要将距离计算除以point.w
。这会产生LIGHT.xyz
和point.xyz
之间的正确距离。
简而言之,如果你正在使用这样的投影矩阵,请确保你了解如何处理所有4个坐标组件,或者知道要问谁:)