This commit is contained in:
parent aaa2a0babb
commit aade631686
1 changed files with 17 additions and 8 deletions

View File

@ -59,9 +59,11 @@ void main()
float acosA; // Косинус между вектором от поверхности к источнику и обратным направлением источника float acosA; // Косинус между вектором от поверхности к источнику и обратным направлением источника
float intensity; // Интенсивность для прожектора float intensity; // Интенсивность для прожектора
vec3 fragPosLightSpace; // Фрагмент в пространстве источника vec3 fragPosLightSpace; // Фрагмент в пространстве источника
float closestDepth; // Значение глубины из буфера тени
float shadowValue; // Значение затененности float shadowValue; // Значение затененности
vec2 texelSize = 1.0 / textureSize(sunShadowDepth, 0); // Размер текселя текстуры теней
int x, y; // Счетчик для PCF
float pcfDepth; // Глубина PCF
// Фоновая освещенность // Фоновая освещенность
color = vec4(ka, 1); color = vec4(ka, 1);
@ -74,10 +76,17 @@ void main()
fragPosLightSpace = (fragPosLightSpace + vec3(1.0)) / 2; fragPosLightSpace = (fragPosLightSpace + vec3(1.0)) / 2;
// Сдвиг для решения проблемы акне // Сдвиг для решения проблемы акне
fragPosLightSpace.z -= max(0.05 * (1.0 - dot(N, sun.direction)), 0.005); fragPosLightSpace.z -= max(0.05 * (1.0 - dot(N, sun.direction)), 0.005);
// Получим значение ближайшей глубины к источнику // Проверка PCF
closestDepth = texture(sunShadowDepth, fragPosLightSpace.xy).r; shadowValue = 0.0;
// Проверим, что рассматриваемый фрагмент ближе чем значение глубины for(x = -1; x <= 1; ++x)
shadowValue = fragPosLightSpace.z > closestDepth ? 1.0 : 0.0; {
for(y = -1; y <= 1; ++y)
{
pcfDepth = texture(sunShadowDepth, fragPosLightSpace.xy + vec2(x, y) * texelSize).r;
shadowValue += fragPosLightSpace.z > pcfDepth ? 1.0 : 0.0;
}
}
shadowValue /= 9;
// Рассчитываем освещенность, если значение тени меньше 1 // Рассчитываем освещенность, если значение тени меньше 1
if (shadowValue < 1.0) if (shadowValue < 1.0)
{ {
@ -91,8 +100,8 @@ void main()
// Зеркальная составляющая // Зеркальная составляющая
specular = pow(max(dot(H, N), 0.0), p*4); // скалярное произведение с отсеканием значений < 0 в степени p specular = pow(max(dot(H, N), 0.0), p*4); // скалярное произведение с отсеканием значений < 0 в степени p
// Результирующий цвет с учетом солнца // Результирующий цвет с учетом солнца
color += vec4(sun.color*kd*diffuse, 1) color += ( vec4(sun.color*kd*diffuse, 1)
+ vec4(sun.color*ks*specular, 1); + vec4(sun.color*ks*specular, 1) ) * (1.0 - shadowValue);
} }
} }