由於我使用的紋理顏色暗淡(這些工件不可見),我有一種奇怪的行爲與我之前從未見過的硬陰影。這裏是我的問題的一些截圖與3米不同的陰影貼圖的分辨率:使用OpenGL和GLSL進行簡單硬陰影貼圖技術的小文物
1)陰影貼圖160 * 120
正如你所看到的,有立方體的表面上的一種牙齒。
這裏的場景的從光位置的視圖:
這裏的陰影貼圖:
2)陰影貼圖640 * 480
由於陰影貼圖帶來更高的精度,因此具有更高的分辨率時,工件更不明顯。
這裏的場景從光的位置來看:
這裏的陰影貼圖:
我試着用更高的分辨率等。當然,文物越來越小,但如果放大表面,它們仍然可見。
下面是我在片段着色器的第二回合期間使用的代碼:
[...]
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剔除的信息)。
感謝您的這些解釋。就我而言,我只想談論立方體上的文物,而不是在平面上(立方體邊緣的「牙齒」)。這些碎片不應該在陰影中。是否有任何技術(偏移或其他)去除立方體邊緣上的這些僞影? – user1364743 2014-10-03 09:00:04
有效地,一個好的解決方案應該是使用抗鋸齒。我已經實施了像PCF技術這樣的技術。但在我的問題中,我只想知道是否有可能刪除硬陰影而不是軟陰影的文物。謝謝你的幫助! – user1364743 2014-10-03 10:20:17
這是同樣的問題。用這種方式考慮一下:你的陰影圖具有有限的分辨率。以陰影圖中的每個像素爲單位,從四個角和中心的每一個投影出一個光線到場景中。在某個時候,你最終可能會得到一個陰影貼圖像素,它將一個或兩個角投影到立方體上,其他角落投影到飛機上。該部分的立方體將最終處於陰影中,因爲陰影圖中只有一個像素可以覆蓋它,並且它被認爲是陰影,因爲中心光線撞擊了平面而不是立方體。 – user1118321 2014-10-03 15:14:07