2014-10-02 66 views
1

由於我使用的紋理顏色暗淡(這些工件不可見),我有一種奇怪的行爲與我之前從未見過的硬陰影。這裏是我的問題的一些截圖與3米不同的陰影貼圖的分辨率:使用OpenGL和GLSL進行簡單硬陰影貼圖技術的小文物

1)陰影貼圖160 * 120

enter image description here

正如你所看到的,有立方體的表面上的一種牙齒。

這裏的場景的從光位置的視圖:

enter image description here

這裏的陰影貼圖:

enter image description here

2)陰影貼圖640 * 480

enter image description here

由於陰影貼圖帶來更高的精度,因此具有更高的分辨率時,工件更不明顯。

這裏的場景從光的位置來看:

enter image description here

這裏的陰影貼圖:

enter image description here

我試着用更高的分辨率等。當然,文物越來越小,但如果放大表面,它們仍然可見。

下面是我在片段着色器的第二回合期間使用的代碼:

[...] 

uniform sampler2DShadow ShadowSampler[MAX_LIGHT_COUNT]; 

[...] 

float GetDynamicShadowBias(vec3 normalDir_cs, vec3 lightDir_cs) 
{ 
    float cosTheta = clamp(dot(normalDir_cs, lightDir_cs), 0.0f, 1.0f); 
    float bias = 0.005f * tan(acos(cosTheta)); 

    return (clamp(bias, 0.0f, 0.01f)); 
} 

float GetBiased_Hard_ShadowFactor(vec3 normalDir, vec3 lightDir, int idx) 
{  
    if (ShadowCoords[idx].w > 0.0f) 
    { 
     float bias = GetDynamicShadowBias(normalDir, lightDir); 

     float LightToOccluderClipDist = texture(
      ShadowSampler[idx], ShadowCoords[idx].xyz/ShadowCoords[idx].w); 

     float LightToVertexClipDist = (ShadowCoords[idx].z - bias)/ShadowCoords[idx].w; 

     if (LightToOccluderClipDist < LightToVertexClipDist) 
      return (0.0f); 
    } 
    return (1.0f); 
} 

所以我想如果有可能取消對多維數據集的邊緣這些文物。我試圖在沒有真正成功的情況下玩弄陰影偏差(對於我在第一遍(填充深度紋理時)使用FRONT_FACE剔除的信息)。

回答

1

有兩件事情在這裏。一個是這是標準陰影貼圖的限制。因爲任何給定對象的陰影都會在地圖中佔用一些潛在的較小數量的像素,所以當您將該地圖投射到場景中時,這些部分可能會重新放大並且會出現鋸齒現象。

看來正在發生的第二件事是你的陰影基本上是1位,它看起來像。他們不是黑色就是白色。如果你以某種方式在創建地圖時對地圖進行抗鋸齒(比如超採樣或其他技術),那麼它就不那麼顯眼了(儘管根據我的經驗它不會完全消失)。

有一些基於經典陰影貼圖的技術。其中一個是來自SIGGRAPH 2013的Subpixel Shadow Mapping。(有some other shadow papers that year, too。)我還看到最近通過GLSL實時實現了射線陰影。 (對不起,找不到鏈接!我會稍後發帖,如果我可以挖掘它。)

+0

感謝您的這些解釋。就我而言,我只想談論立方體上的文物,而不是在平面上(立方體邊緣的「牙齒」)。這些碎片不應該在陰影中。是否有任何技術(偏移或其他)去除立方體邊緣上的這些僞影? – user1364743 2014-10-03 09:00:04

+0

有效地,一個好的解決方案應該是使用抗鋸齒。我已經實施了像PCF技術這樣的技術。但在我的問題中,我只想知道是否有可能刪除硬陰影而不是軟陰影的文物。謝謝你的幫助! – user1364743 2014-10-03 10:20:17

+0

這是同樣的問題。用這種方式考慮一下:你的陰影圖具有有限的分辨率。以陰影圖中的每個像素爲單位,從四個角和中心的每一個投影出一個光線到場景中。在某個時候,你最終可能會得到一個陰影貼圖像素,它將一個或兩個角投影到立方體上,其他角落投影到飛機上。該部分的立方體將最終處於陰影中,因爲陰影圖中只有一個像素可以覆蓋它,並且它被認爲是陰影,因爲中心光線撞擊了平面而不是立方體。 – user1118321 2014-10-03 15:14:07