我正在給older video game engine添加一些適度的功能。它具有簡單的平面陰影,使用模板緩衝區和一個projection matrix popularized in SGI's cookbook年前。GLSL軟平面陰影:矩陣轉換
這些工作得相當好,但不包含在強度根據光源的衰減褪色。這是我想在我的着色器中完成的。不幸的是,我無法弄清楚是否允許這樣做。這是我的着色器源代碼。我與#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
。