From 698ad941f5bb9770f75d20a790950e3fbc549851 Mon Sep 17 00:00:00 2001 From: "re.kovalev" Date: Tue, 31 Oct 2023 21:59:42 +0300 Subject: [PATCH] =?UTF-8?q?=D0=9E=D1=81=D0=B2=D0=B5=D1=89=D0=B5=D0=BD?= =?UTF-8?q?=D0=B8=D0=B5=20=D1=81=20=D1=83=D1=87=D0=B5=D1=82=D0=BE=D0=BC=20?= =?UTF-8?q?=D0=BA=D0=B0=D1=81=D0=BA=D0=B0=D0=B4=D0=BD=D1=8B=D1=85=20=D1=82?= =?UTF-8?q?=D0=B5=D0=BD=D0=B5=D0=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- shaders/lighting.frag | 18 +++++++++++++----- 1 file changed, 13 insertions(+), 5 deletions(-) diff --git a/shaders/lighting.frag b/shaders/lighting.frag index 33e4fbd..a644141 100644 --- a/shaders/lighting.frag +++ b/shaders/lighting.frag @@ -27,7 +27,7 @@ layout(std140, binding = 3) uniform Sun { vec3 direction; vec3 color; - mat4 vp; + mat4 vp[4]; } sun; uniform float camera_cascade_distances[4]; // Размер массива должен соответствовать количеству каскадов @@ -36,7 +36,7 @@ uniform sampler2D gPosition; uniform sampler2D gNormal; uniform sampler2D gDiffuseP; uniform sampler2D gAmbientSpecular; -uniform sampler2D sunShadowDepth; +uniform sampler2DArray sunShadowDepth; out vec4 color; @@ -62,10 +62,18 @@ void main() float intensity; // Интенсивность для прожектора vec3 fragPosLightSpace; // Фрагмент в пространстве источника float shadowValue; // Значение затененности - vec2 texelSize = 1.0 / textureSize(sunShadowDepth, 0); // Размер текселя текстуры теней + vec2 texelSize = 1.0 / textureSize(sunShadowDepth, 0).xy; // Размер текселя текстуры теней int x, y; // Счетчик для PCF float pcfDepth; // Глубина PCF + vec4 fragPosCamSpace = camera.view * vec4(fragPos, 1); // Фрагмент в пространстве камеры + int cascade_index; // Индекс текущего каскада для вычисления теней + + // Определение индекса каскада в который попадает фрагмент (цикл на 1 меньше чем кол-во каскадов) + for (cascade_index = 0; cascade_index < 3; cascade_index++) + if (abs(fragPosCamSpace.z) < camera_cascade_distances[cascade_index]) + break; + // Фоновая освещенность color = vec4(ka, 1); @@ -73,7 +81,7 @@ void main() if (length(sun.color) > 0) { // Расположение фрагмента в координатах теневой карты - fragPosLightSpace = (sun.vp * vec4(fragPos, 1.0)).xyz; + fragPosLightSpace = (sun.vp[cascade_index] * vec4(fragPos, 1.0)).xyz; // Переход от [-1;1] к [0;1] fragPosLightSpace = (fragPosLightSpace + vec3(1.0)) / 2; // Сдвиг для решения проблемы акне @@ -84,7 +92,7 @@ void main() { for(y = -1; y <= 1; ++y) { - pcfDepth = texture(sunShadowDepth, fragPosLightSpace.xy + vec2(x, y) * texelSize).r; + pcfDepth = texture(sunShadowDepth, vec3(fragPosLightSpace.xy + vec2(x, y) * texelSize, cascade_index)).r; shadowValue += fragPosLightSpace.z > pcfDepth ? 1.0 : 0.0; } }