2015-01-31 113 views
2

我正在給older video game engine添加一些適度的功能。它具有簡單的平面陰影,使用模板緩衝區和一個projection matrix popularized in SGI's cookbook年前。GLSL軟平面陰影:矩陣轉換

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

Freenode上## OpenGL的有用社區成員指出了我的錯誤。由於投影矩陣MATRIX不產生仿射變換,因此我需要將距離計算除以point.w。這產生了LIGHT.xyzpoint.xyz之間的正確距離。

總之,如果您使用這樣的投影矩陣,請確保您瞭解如何處理所有4個座標分量,或知道該問誰:)