Освещение с учетом каскадных теней
This commit is contained in:
		
							parent
							
								
									d76369c5ff
								
							
						
					
					
						commit
						cf3d441184
					
				| @ -27,7 +27,7 @@ layout(std140, binding = 3) uniform Sun | |||||||
| { | { | ||||||
|     vec3 direction; |     vec3 direction; | ||||||
|     vec3 color; |     vec3 color; | ||||||
|     mat4 vp; |     mat4 vp[4]; | ||||||
| } sun; | } sun; | ||||||
| 
 | 
 | ||||||
| uniform float camera_cascade_distances[4]; // Размер массива должен соответствовать количеству каскадов | uniform float camera_cascade_distances[4]; // Размер массива должен соответствовать количеству каскадов | ||||||
| @ -36,7 +36,7 @@ uniform sampler2D gPosition; | |||||||
| uniform sampler2D gNormal; | uniform sampler2D gNormal; | ||||||
| uniform sampler2D gDiffuseP; | uniform sampler2D gDiffuseP; | ||||||
| uniform sampler2D gAmbientSpecular; | uniform sampler2D gAmbientSpecular; | ||||||
| uniform sampler2D sunShadowDepth; | uniform sampler2DArray sunShadowDepth; | ||||||
| 
 | 
 | ||||||
| out vec4 color;  | out vec4 color;  | ||||||
| 
 | 
 | ||||||
| @ -62,10 +62,18 @@ void main() | |||||||
|     float intensity; // Интенсивность для прожектора |     float intensity; // Интенсивность для прожектора | ||||||
|     vec3 fragPosLightSpace; // Фрагмент в пространстве источника |     vec3 fragPosLightSpace; // Фрагмент в пространстве источника | ||||||
|     float shadowValue; // Значение затененности |     float shadowValue; // Значение затененности | ||||||
|     vec2 texelSize = 1.0 / textureSize(sunShadowDepth, 0); // Размер текселя текстуры теней |     vec2 texelSize = 1.0 / textureSize(sunShadowDepth, 0).xy; // Размер текселя текстуры теней | ||||||
|     int x, y; // Счетчик для PCF |     int x, y; // Счетчик для PCF | ||||||
|     float pcfDepth; // Глубина 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); |     color = vec4(ka, 1); | ||||||
|      |      | ||||||
| @ -73,7 +81,7 @@ void main() | |||||||
|     if (length(sun.color) > 0) |     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] |         // Переход от [-1;1] к [0;1] | ||||||
|         fragPosLightSpace = (fragPosLightSpace + vec3(1.0)) / 2; |         fragPosLightSpace = (fragPosLightSpace + vec3(1.0)) / 2; | ||||||
|         // Сдвиг для решения проблемы акне |         // Сдвиг для решения проблемы акне | ||||||
| @ -84,7 +92,7 @@ void main() | |||||||
|         { |         { | ||||||
|             for(y = -1; y <= 1; ++y) |             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;         |                 shadowValue += fragPosLightSpace.z > pcfDepth  ? 1.0 : 0.0;         | ||||||
|             } |             } | ||||||
|         } |         } | ||||||
|  | |||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user