Шейдеры освещения
This commit is contained in:
		
							parent
							
								
									035eac51ce
								
							
						
					
					
						commit
						2bbc3641ed
					
				
							
								
								
									
										51
									
								
								shaders/lighting.frag
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										51
									
								
								shaders/lighting.frag
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,51 @@ | ||||
| #version 420 core  | ||||
| 
 | ||||
| in vec2 texCoord; | ||||
| 
 | ||||
| layout(std140, binding = 0) uniform Camera | ||||
| { | ||||
|     mat4 projection; | ||||
|     mat4 view; | ||||
|     vec3 position; | ||||
| } camera; | ||||
| 
 | ||||
| layout(std140, binding = 2) uniform Light | ||||
| { | ||||
|     vec3 position; | ||||
|     vec3 color; | ||||
| } light_f; | ||||
| 
 | ||||
| uniform sampler2D gPosition; | ||||
| uniform sampler2D gNormal; | ||||
| uniform sampler2D gDiffuseP; | ||||
| uniform sampler2D gAmbientSpecular; | ||||
| 
 | ||||
| out vec4 color;  | ||||
| 
 | ||||
| void main()  | ||||
| {  | ||||
|     // Получим данные из текстур буфера | ||||
|     vec3 fragPos = texture(gPosition, texCoord).rgb; | ||||
|     vec3 N = texture(gNormal, texCoord).rgb; | ||||
|     vec3 kd = texture(gDiffuseP, texCoord).rgb; | ||||
|     vec3 ka = texture(gAmbientSpecular, texCoord).rgb; | ||||
|     float ks = texture(gAmbientSpecular, texCoord).a; | ||||
|     float p = texture(gDiffuseP, texCoord).a; | ||||
|      | ||||
|     // Данные о камере относительно фрагмента | ||||
|     vec3 Cam_vertex = normalize(camera.position - fragPos); | ||||
|     // Данные об источнике отностиельно фрагмента | ||||
|     vec3 L_vertex = normalize(light_f.position - fragPos); | ||||
| 
 | ||||
|     // Диффузная составляющая | ||||
|     float diffuse = max(dot(L_vertex, N), 0.0); // скалярное произведение с отсеканием значений < 0 | ||||
|      | ||||
|     // Вектор половины пути | ||||
| 	vec3 H = normalize(L_vertex + Cam_vertex); | ||||
|     // Зеркальная составляющая | ||||
|     float specular = pow(max(dot(H, N), 0.0), p*4); // скалярное произведение с отсеканием значений < 0 в степени p | ||||
| 
 | ||||
|     color = vec4(ka, 1) | ||||
|           + vec4(light_f.color*kd*diffuse, 1)  | ||||
|           + vec4(light_f.color*ks*specular, 1); | ||||
| }  | ||||
| @ -1,12 +0,0 @@ | ||||
| #version 420 core  | ||||
| 
 | ||||
| in vec2 texCoord; | ||||
| 
 | ||||
| uniform sampler2D tex; | ||||
| 
 | ||||
| out vec4 color;  | ||||
| 
 | ||||
| void main()  | ||||
| {  | ||||
|     color = texture(tex, texCoord); | ||||
| }  | ||||
							
								
								
									
										21
									
								
								src/main.cpp
									
									
									
									
									
								
							
							
						
						
									
										21
									
								
								src/main.cpp
									
									
									
									
									
								
							| @ -129,12 +129,14 @@ int main(void) | ||||
|     // Активируем базовый буфер кадра
 | ||||
|     FBO::useDefault(); | ||||
| 
 | ||||
|     // Шейдер для переноса текстуры на прямоугольник
 | ||||
|     ShaderProgram quadProgram; | ||||
|     // Шейдер для расчета освещенности
 | ||||
|     ShaderProgram lightShader; | ||||
|     // Загрузка и компиляция шейдеров
 | ||||
|     quadProgram.load(GL_VERTEX_SHADER, "shaders/quad.vert"); | ||||
|     quadProgram.load(GL_FRAGMENT_SHADER, "shaders/quad.frag"); | ||||
|     quadProgram.link(); | ||||
|     lightShader.load(GL_VERTEX_SHADER, "shaders/quad.vert"); | ||||
|     lightShader.load(GL_FRAGMENT_SHADER, "shaders/lighting.frag"); | ||||
|     lightShader.link(); | ||||
|     const char* gtextures_shader_names[]  = {"gPosition", "gNormal", "gDiffuseP", "gAmbientSpecular"}; | ||||
|     lightShader.bindTextures(gtextures_shader_names, sizeof(gtextures_shader_names)/sizeof(const char*)); | ||||
| 
 | ||||
|     glm::vec3 quadVertices[] = { {-1.0f,  1.0f, 0.0f} | ||||
|                                , {-1.0f, -1.0f, 0.0f} | ||||
| @ -167,12 +169,15 @@ int main(void) | ||||
|         // Активируем базовый буфер кадра
 | ||||
|         FBO::useDefault(); | ||||
|         // Подключаем шейдер для прямоугольника
 | ||||
|         quadProgram.use(); | ||||
|         lightShader.use(); | ||||
|         // Очистка буфера цвета и глубины
 | ||||
|         glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); | ||||
|         // Подключаем текстуру цветов
 | ||||
|         // Подключаем текстуры G-буфера
 | ||||
|         gPosition.use(); | ||||
|         gNormal.use(); | ||||
|         gDiffuseP.use(); | ||||
|         // Рендерим прямоугольник
 | ||||
|         gAmbientSpecular.use(); | ||||
|         // Рендерим прямоугольник с расчетом освещения
 | ||||
|         quadModel.render(); | ||||
| 
 | ||||
|         // Представление содержимого буфера цепочки показа на окно
 | ||||
|  | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user