2013-07-09 91 views
1

我剛剛開始工作(它看起來工作得非常快)雷射系統可以製作基本的照明(像demo demo這樣工作:http://www.redblobgames.com/articles/visibility/)。它可以像我想要的那樣工作,但是當我設置每個頂點距離玩家/光源的點亮區域時,它的插值非常糟糕,例如,如果我想在遠處修剪光線/陰影到X,我沒有但圓形和多邊形/正方形之間的東西。圖片應該解釋。OpenGL GLSL基本雷電距離插值精度不高(2D)

此外 - 我用它爲我的3D項目(遊戲)與自上而下的相機,如果有關係。 (見下圖)。算法效果很好,不需要在shadders本身上工作,而是在其上繪製簡單的空間。 (無裁剪等)

這裏是我的頂點着色器:

#version 330 core 
layout(location = 0) in vec3 vertexPosition_modelspace; //vertex's position 
layout(location = 1) in vec3 Normal; //normal, currently not used, but added for future 
layout(location = 2) in vec2 vertexUV; //texture coords, used and works ok 

out vec2 UV; //here i send tex coords 
out float intensity; //and this is distance from light source to current vertex (its meant to be interpolated to FS) 

uniform mat4 MVP; //mvp matrix 
uniform vec2 light_pos; //light-source's position in 2d 

void main(){ 
    gl_Position = MVP * vec4(vertexPosition_modelspace,1); 
    UV = vertexUV; 
    intensity = distance(light_pos, vertexPosition_modelspace.xz); //distance between two vectors 
} 

這裏是我的片段着色器:

#version 330 core 

in vec2 UV; //tex coords 
in float intensity; //distance from light source 
out vec4 color; //output 
uniform sampler2D myTextureSampler; //texture 
uniform float Opacity; //opacity of layer, used and works as expected (though to be change in near future) 

void main() { 
    color = texture(myTextureSampler, UV); 
    color.rgba = vec4(0.0, 0.0, 0.0, 0.5); 
    if(intensity > 5) 
     color.a = 0; 
    else 
     color.a = 0.5; 
} 

此代碼應該給我很好的FOV的圓修剪,而是我得到這樣的東西: It's clearly not a circle-like shape

我不知道它爲什麼工作,因爲它的工作...

+0

另外,不要介意紋理和模型,它只是當時我在其他更重要的東西上工作的時間。當我完成更緊迫的事情時,我會填補這一點,我希望有一位朋友會幫助我,因爲我吸收這種東西;) – RippeR

+0

我們在圖片中看到了什麼?灰色的alpha覆蓋了一個新的多邊形還是與背景中的頂點相同,只是由着色器變暗了?如果它是一個新的多邊形(我認爲是這樣),也許你的閾值5太大了。 –

+0

如果我通過片段着色器中的距離東西來關閉剪輯,我會得到標準的[THIS](http://i.imgur.com/fOSixFg.png)。我簡單地使用光線投射來獲得二維空間中的點(從3D空間,我不在乎OY在這裏),從中我可以創建多邊形(或使用三角形扇),這是從這個評論的圖片較暗。如果我只爲這個較暗的多邊形使用特殊着色器,併爲它提供光源/播放器的位置,我想讓那個較暗的效果慢慢消失(因此我計算方向)。不幸的是,它看起來不像內插太好,正如主帖中的圖片所示。 – RippeR

回答

0

這不是一個準確性問題,這是算法性的,很容易看出你是否將一個三角形與所有邊相等並且將對象放在其中一個頂點上。在其他兩個頂點中,您將獲得相同的距離,沿着這兩個相距較遠的點之間的邊緣,您將獲得相同的距離,這是錯誤的,因爲它應該在該邊緣的中心處更大。

如果您在光源處使用角度較小的三角形,可以使其平滑。

更新:如果通過每個三角形的光照位置,並且將使用插值座標計算片段着色器中的實際距離,則仍然可以獲得圓形陰影。