Шейдеры для теней от точечных источников
This commit is contained in:
		
							parent
							
								
									3fcf71b2d5
								
							
						
					
					
						commit
						179ac3a62a
					
				
							
								
								
									
										17
									
								
								shaders/point_shadow.frag
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										17
									
								
								shaders/point_shadow.frag
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,17 @@
 | 
				
			|||||||
 | 
					#version 330 core
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					in vec4 FragPos;
 | 
				
			||||||
 | 
					in vec3 lightPos;
 | 
				
			||||||
 | 
					in float radius;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void main()
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    // Расстояние между источником и фрагментом
 | 
				
			||||||
 | 
					    float lightDistance = length(FragPos.xyz - lightPos);
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					    // Приведение к диапазону [0;1]
 | 
				
			||||||
 | 
					    lightDistance = lightDistance / radius;
 | 
				
			||||||
 | 
					    
 | 
				
			||||||
 | 
					    // Замена значения глубины
 | 
				
			||||||
 | 
					    gl_FragDepth = lightDistance;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
							
								
								
									
										38
									
								
								shaders/point_shadow.geom
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										38
									
								
								shaders/point_shadow.geom
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,38 @@
 | 
				
			|||||||
 | 
					#version 420 core
 | 
				
			||||||
 | 
					layout (triangles, invocations = 6) in; // здесь invocations соответствует числу сторон кубической карты теней
 | 
				
			||||||
 | 
					layout (triangle_strip, max_vertices=18) out; // здесь max_vertices = 3 вершины * 6 вызовов на стороны куба
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					struct LightData
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    vec3 position;
 | 
				
			||||||
 | 
					    vec3 color;
 | 
				
			||||||
 | 
					    vec3 attenuation;
 | 
				
			||||||
 | 
					    vec4 direction_angle;
 | 
				
			||||||
 | 
					    mat4 vp[6];
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					layout(std140, binding = 2) uniform Light
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    LightData data[64];
 | 
				
			||||||
 | 
					    int count;
 | 
				
			||||||
 | 
					} light_g;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					uniform int light_i;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					out vec4 FragPos; 
 | 
				
			||||||
 | 
					out vec3 lightPos;
 | 
				
			||||||
 | 
					out float radius;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					void main()
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    for(int i = 0; i < 3; ++i)
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        FragPos = gl_in[i].gl_Position;
 | 
				
			||||||
 | 
					        lightPos = light_g.data[light_i].position;
 | 
				
			||||||
 | 
					        radius = light_g.data[light_i].attenuation.r;
 | 
				
			||||||
 | 
					        gl_Position = light_g.data[light_i].vp[gl_InvocationID] * gl_in[i].gl_Position;
 | 
				
			||||||
 | 
					        gl_Layer = gl_InvocationID + light_i*6; 
 | 
				
			||||||
 | 
					        EmitVertex();
 | 
				
			||||||
 | 
					    }    
 | 
				
			||||||
 | 
					    EndPrimitive();
 | 
				
			||||||
 | 
					} 
 | 
				
			||||||
@ -199,6 +199,14 @@ int main(void)
 | 
				
			|||||||
    // Активируем базовый буфер кадра
 | 
					    // Активируем базовый буфер кадра
 | 
				
			||||||
    FBO::useDefault();
 | 
					    FBO::useDefault();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    // Шейдер для расчета теней от точечных источников
 | 
				
			||||||
 | 
					    ShaderProgram pointShadowShader;
 | 
				
			||||||
 | 
					    // Загрузим шейдер
 | 
				
			||||||
 | 
					    pointShadowShader.load(GL_VERTEX_SHADER, "shaders/sun_shadow.vert");
 | 
				
			||||||
 | 
					    pointShadowShader.load(GL_GEOMETRY_SHADER, "shaders/point_shadow.geom");
 | 
				
			||||||
 | 
					    pointShadowShader.load(GL_FRAGMENT_SHADER, "shaders/point_shadow.frag");
 | 
				
			||||||
 | 
					    pointShadowShader.link();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    // Модель прямоугольника
 | 
					    // Модель прямоугольника
 | 
				
			||||||
    Model rectangle; 
 | 
					    Model rectangle; 
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user