Матрицы проекции и вида для точечных источников
This commit is contained in:
		
							parent
							
								
									402560bcff
								
							
						
					
					
						commit
						3fcf71b2d5
					
				@ -18,6 +18,7 @@ struct LightData
 | 
				
			|||||||
    alignas(16) glm::vec3 color; // Цвет 
 | 
					    alignas(16) glm::vec3 color; // Цвет 
 | 
				
			||||||
    alignas(16) glm::vec3 attenuation; // Радиус действия источника, линейный и квадратичный коэф. угасания   
 | 
					    alignas(16) glm::vec3 attenuation; // Радиус действия источника, линейный и квадратичный коэф. угасания   
 | 
				
			||||||
    alignas(16) glm::vec4 direction_angle; // Направление и половинный угол освещенности
 | 
					    alignas(16) glm::vec4 direction_angle; // Направление и половинный угол освещенности
 | 
				
			||||||
 | 
					    alignas(16) glm::mat4 vp[6]; // Матрицы проекции и трансформации в пространство источника
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// Источник света
 | 
					// Источник света
 | 
				
			||||||
@ -58,6 +59,7 @@ class Light : public Node
 | 
				
			|||||||
        void toData(); // Преобразует информацию об источнике в структуру LightData
 | 
					        void toData(); // Преобразует информацию об источнике в структуру LightData
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        virtual void recalcMatrices(); // Метод пересчета матрицы трансформации по необходимости, должен сбрасывать флаг changed
 | 
					        virtual void recalcMatrices(); // Метод пересчета матрицы трансформации по необходимости, должен сбрасывать флаг changed
 | 
				
			||||||
 | 
					        void recalcVP(); // Пересчитывает по необходимости матрицу вида-проекции
 | 
				
			||||||
 | 
					
 | 
				
			||||||
        static GLuint count; // количество используемых источников (должно быть <= MAX_LIGHTS)
 | 
					        static GLuint count; // количество используемых источников (должно быть <= MAX_LIGHTS)
 | 
				
			||||||
        static LightData data[MAX_LIGHTS]; // Массив данных по источникам света
 | 
					        static LightData data[MAX_LIGHTS]; // Массив данных по источникам света
 | 
				
			||||||
 | 
				
			|||||||
@ -98,7 +98,15 @@ void Light::toData()
 | 
				
			|||||||
{
 | 
					{
 | 
				
			||||||
    check_id(); // Проверка на работу с корректным индексом
 | 
					    check_id(); // Проверка на работу с корректным индексом
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    data[index].position = glm::vec3(result_transform[3]); // Позиция из матрицы трансформации
 | 
					    // Если позиция изменилась
 | 
				
			||||||
 | 
					    if (data[index].position.x != result_transform[3].x
 | 
				
			||||||
 | 
					    ||  data[index].position.y != result_transform[3].y
 | 
				
			||||||
 | 
					    ||  data[index].position.z != result_transform[3].z
 | 
				
			||||||
 | 
					    )
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
					        data[index].position = glm::vec3(result_transform[3]); // Позиция из матрицы трансформации
 | 
				
			||||||
 | 
					        recalcVP(); // Пересчет матрицы вида-проекции для расчета теней
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
    data[index].color = color; // Цвет
 | 
					    data[index].color = color; // Цвет
 | 
				
			||||||
    // Если радиус изменился
 | 
					    // Если радиус изменился
 | 
				
			||||||
    if (data[index].attenuation.r != radius)
 | 
					    if (data[index].attenuation.r != radius)
 | 
				
			||||||
@ -346,3 +354,16 @@ void Sun::recalcVP()
 | 
				
			|||||||
        }
 | 
					        }
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// Пересчитывает по необходимости матрицу вида-проекции
 | 
				
			||||||
 | 
					void Light::recalcVP()
 | 
				
			||||||
 | 
					{    
 | 
				
			||||||
 | 
					    float near_plane = 0.1f;
 | 
				
			||||||
 | 
					    glm::mat4 shadowProj = glm::perspective(glm::radians(90.0f), 1.0f, near_plane, radius);
 | 
				
			||||||
 | 
					    data[index].vp[0] = shadowProj * glm::lookAt(position, position + glm::vec3( 1.0f,  0.0f,  0.0f), glm::vec3(0.0f, -1.0f,  0.0f));
 | 
				
			||||||
 | 
					    data[index].vp[1] = shadowProj * glm::lookAt(position, position + glm::vec3(-1.0f,  0.0f,  0.0f), glm::vec3(0.0f, -1.0f,  0.0f));
 | 
				
			||||||
 | 
					    data[index].vp[2] = shadowProj * glm::lookAt(position, position + glm::vec3( 0.0f,  1.0f,  0.0f), glm::vec3(0.0f,  0.0f,  1.0f));
 | 
				
			||||||
 | 
					    data[index].vp[3] = shadowProj * glm::lookAt(position, position + glm::vec3( 0.0f, -1.0f,  0.0f), glm::vec3(0.0f,  0.0f, -1.0f));
 | 
				
			||||||
 | 
					    data[index].vp[4] = shadowProj * glm::lookAt(position, position + glm::vec3( 0.0f,  0.0f,  1.0f), glm::vec3(0.0f, -1.0f,  0.0f));
 | 
				
			||||||
 | 
					    data[index].vp[5] = shadowProj * glm::lookAt(position, position + glm::vec3( 0.0f,  0.0f, -1.0f), glm::vec3(0.0f, -1.0f,  0.0f));
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user