Шейдер для вычисления SSAO
This commit is contained in:
		
							parent
							
								
									2a162c1293
								
							
						
					
					
						commit
						d0a794b33b
					
				
							
								
								
									
										60
									
								
								shaders/ssao.frag
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										60
									
								
								shaders/ssao.frag
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,60 @@ | |||||||
|  | #version 420 core | ||||||
|  | 
 | ||||||
|  | in vec2 texCoord; | ||||||
|  | 
 | ||||||
|  | out float occlusion; | ||||||
|  | 
 | ||||||
|  | uniform sampler2D gPosition; | ||||||
|  | uniform sampler2D gNormal; | ||||||
|  | uniform sampler2D noise; | ||||||
|  | 
 | ||||||
|  | layout(std140, binding = 0) uniform Camera | ||||||
|  | { | ||||||
|  |     mat4 projection; | ||||||
|  |     mat4 view; | ||||||
|  |     vec3 position; | ||||||
|  | } camera; | ||||||
|  | 
 | ||||||
|  | layout(std140, binding = 3) uniform SSAO | ||||||
|  | { | ||||||
|  |     float radius; | ||||||
|  |     float bias; | ||||||
|  |     int size; | ||||||
|  |     vec2 scale; | ||||||
|  |     vec3 samples[64]; | ||||||
|  | } ssao; | ||||||
|  | 
 | ||||||
|  | void main() | ||||||
|  | { | ||||||
|  |     // Получим информацию из текстур для данного фрагмента по текстурным координатам | ||||||
|  |     vec3 fragPos = (camera.view * vec4(texture(gPosition, texCoord).xyz, 1)).xyz; | ||||||
|  |     vec3 normal = normalize(texture(gNormal, texCoord).rgb); | ||||||
|  |     vec3 randomVec = normalize(texture(noise, texCoord * ssao.scale).xyz); | ||||||
|  |     // Расчет TBN матрицы | ||||||
|  |     vec3 tangent = normalize(randomVec - normal * dot(randomVec, normal)); | ||||||
|  |     vec3 bitangent = cross(normal, tangent); | ||||||
|  |     mat3 TBN = mat3(tangent, bitangent, normal); | ||||||
|  |      | ||||||
|  |     float sampleDepth; // Значение глубины образца выборки | ||||||
|  |     vec3 samplePos; // Выборка, ориентированная в пространстве вида камеры | ||||||
|  |     vec4 sampleCoord; // Выборка, преобразованная к текстурным координатам | ||||||
|  |      | ||||||
|  |     // Проинициализируем значение счетчика и запустим цикл по выборкам | ||||||
|  |     occlusion = 0; | ||||||
|  |     for(int i = 0; i < ssao.size; i++) | ||||||
|  |     { | ||||||
|  |         samplePos = TBN * ssao.samples[i]; // в TBN-пространстве | ||||||
|  |         samplePos = fragPos + samplePos * ssao.radius; // в пространстве вида камеры | ||||||
|  |          | ||||||
|  |         sampleCoord = camera.projection * vec4(samplePos, 1.0);  | ||||||
|  |         sampleCoord.xyz /= sampleCoord.w; // Деление на значение перспективы | ||||||
|  |         sampleCoord.xyz = sampleCoord.xyz * 0.5 + 0.5; // Трансформация в диапазон [0.0; 1.0] | ||||||
|  |          | ||||||
|  |         // Получаем значение глубины по образцу выборки | ||||||
|  |         sampleDepth = (camera.view * vec4(texture(gPosition, sampleCoord.xy).rgb, 1)).z;  | ||||||
|  | 
 | ||||||
|  |         occlusion += (sampleDepth >= samplePos.z + ssao.bias ? 1.0 : 0.0); | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     occlusion = 1 - (occlusion / ssao.size); | ||||||
|  | } | ||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user