Освещение с учетом каскадных теней
This commit is contained in:
		
							parent
							
								
									d76369c5ff
								
							
						
					
					
						commit
						cf3d441184
					
				| @ -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;         | ||||
|             } | ||||
|         } | ||||
|  | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user