Отражения на основании скайбокса
This commit is contained in:
		
							parent
							
								
									17a78d6c05
								
							
						
					
					
						commit
						2ec6349ae1
					
				@ -42,6 +42,7 @@ uniform sampler2DArray sunShadowDepth;
 | 
				
			|||||||
uniform samplerCubeArray pointShadowDepth;
 | 
					uniform samplerCubeArray pointShadowDepth;
 | 
				
			||||||
uniform sampler2D ssao;
 | 
					uniform sampler2D ssao;
 | 
				
			||||||
uniform usampler2D gID;
 | 
					uniform usampler2D gID;
 | 
				
			||||||
 | 
					uniform samplerCube reflections;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
uniform uvec3 selectedID;
 | 
					uniform uvec3 selectedID;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@ -78,6 +79,23 @@ vec3 F(vec3 H, vec3 Cam_vertex, float metallic, float specular, vec3 base_color)
 | 
				
			|||||||
    return F0 + (1 - F0) * pow(1 - max(dot(H, Cam_vertex),0), 5);
 | 
					    return F0 + (1 - F0) * pow(1 - max(dot(H, Cam_vertex),0), 5);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					float G_Sclick_Beckmann_HS(float NDotDir, float a)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    float tmp = (a+1)*(a+1) / 2;
 | 
				
			||||||
 | 
					    return 1 / (NDotDir * (1 - tmp) + tmp);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					float G_Smith_HS(float LDotN, float CamDotN, float a)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    return G_Sclick_Beckmann_HS(LDotN, a) * G_Sclick_Beckmann_HS(CamDotN, a);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					vec3 F_roughness(vec3 H, vec3 Cam_vertex, float metallic, float roughness, float specular, vec3 base_color)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    vec3 F0 = mix(vec3(0.08 * specular), base_color, metallic);
 | 
				
			||||||
 | 
					    return F0 + (max(vec3(1.0 - roughness), F0) - F0) * pow(1 - max(dot(H, Cam_vertex),0), 5);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void main() 
 | 
					void main() 
 | 
				
			||||||
{ 
 | 
					{ 
 | 
				
			||||||
    // Получим данные из текстур буфера
 | 
					    // Получим данные из текстур буфера
 | 
				
			||||||
@ -123,6 +141,23 @@ void main()
 | 
				
			|||||||
    // Если у модели есть нормаль
 | 
					    // Если у модели есть нормаль
 | 
				
			||||||
    if (length(N) > 0)
 | 
					    if (length(N) > 0)
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
 | 
					        // Отражения на основании карт отражений
 | 
				
			||||||
 | 
					        vec3 reflectedVec = reflect(-Cam_vertex, N);
 | 
				
			||||||
 | 
					        vec3 reflectedColor = textureLod(reflections, reflectedVec, 6*roughness).rgb;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        LDotN = dot(reflectedVec, N);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        // Вектор половины пути
 | 
				
			||||||
 | 
					        H = normalize(reflectedVec + Cam_vertex);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        // Зеркальное отражение
 | 
				
			||||||
 | 
					        ks = F_roughness(N, Cam_vertex, metallic, roughness, specular, base_color);
 | 
				
			||||||
 | 
					        fs = ks * min(D(H, N, roughness*roughness) / 4, 1) * G_Smith_HS(LDotN, CamDotN, roughness*roughness);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        // Результирующий цвет с учетом солнца
 | 
				
			||||||
 | 
					        color.rgb += fs * reflectedColor * LDotN;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        
 | 
				
			||||||
        // Расчет солнца, если его цвет не черный
 | 
					        // Расчет солнца, если его цвет не черный
 | 
				
			||||||
        if (length(sun.color) > 0)
 | 
					        if (length(sun.color) > 0)
 | 
				
			||||||
        {
 | 
					        {
 | 
				
			||||||
 | 
				
			|||||||
@ -320,12 +320,14 @@ TextureCube::TextureCube(GLuint t, const std::string (&filename)[6])
 | 
				
			|||||||
    else
 | 
					    else
 | 
				
			||||||
        handler = filename_handler[complex_name];
 | 
					        handler = filename_handler[complex_name];
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
 | 
					    glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR); 
 | 
				
			||||||
    glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
 | 
					    glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
 | 
				
			||||||
    glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
 | 
					    glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
 | 
				
			||||||
    glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
 | 
					    glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
 | 
				
			||||||
    glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_R, GL_CLAMP_TO_EDGE);
 | 
					    glTexParameteri(GL_TEXTURE_CUBE_MAP, GL_TEXTURE_WRAP_R, GL_CLAMP_TO_EDGE);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    glGenerateMipmap(GL_TEXTURE_CUBE_MAP);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    handler_count[handler]++;
 | 
					    handler_count[handler]++;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
				
			|||||||
@ -214,7 +214,7 @@ int main(void)
 | 
				
			|||||||
    lightShader.load(GL_FRAGMENT_SHADER, "shaders/lighting.frag");
 | 
					    lightShader.load(GL_FRAGMENT_SHADER, "shaders/lighting.frag");
 | 
				
			||||||
    lightShader.link();
 | 
					    lightShader.link();
 | 
				
			||||||
    // Привязка текстур
 | 
					    // Привязка текстур
 | 
				
			||||||
    const char* gtextures_shader_names[]  = {"gPosition", "gNormal", "gBaseColor", "gRMS", "sunShadowDepth", "pointShadowDepth", "ssao", "gID", "gEmittedColor"};
 | 
					    const char* gtextures_shader_names[]  = {"gPosition", "gNormal", "gBaseColor", "gRMS", "sunShadowDepth", "pointShadowDepth", "ssao", "gID", "gEmittedColor", "reflections"};
 | 
				
			||||||
    lightShader.bindTextures(gtextures_shader_names, sizeof(gtextures_shader_names)/sizeof(const char*));
 | 
					    lightShader.bindTextures(gtextures_shader_names, sizeof(gtextures_shader_names)/sizeof(const char*));
 | 
				
			||||||
    // Загрузка данных о границах каскадов
 | 
					    // Загрузка данных о границах каскадов
 | 
				
			||||||
    glUniform1fv(lightShader.getUniformLoc("camera_cascade_distances"), CAMERA_CASCADE_COUNT, &camera_cascade_distances[1]);
 | 
					    glUniform1fv(lightShader.getUniformLoc("camera_cascade_distances"), CAMERA_CASCADE_COUNT, &camera_cascade_distances[1]);
 | 
				
			||||||
@ -451,6 +451,10 @@ int main(void)
 | 
				
			|||||||
    Scale scale;
 | 
					    Scale scale;
 | 
				
			||||||
    TRS& currentTool = transform; 
 | 
					    TRS& currentTool = transform; 
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    // Текстура для отражений скайбокса
 | 
				
			||||||
 | 
					    TextureCube reflections_texture(skybox_texture);
 | 
				
			||||||
 | 
					    reflections_texture.setType(9);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    // Пока не произойдет событие запроса закрытия окна
 | 
					    // Пока не произойдет событие запроса закрытия окна
 | 
				
			||||||
    while(!glfwWindowShouldClose(window))
 | 
					    while(!glfwWindowShouldClose(window))
 | 
				
			||||||
    {
 | 
					    {
 | 
				
			||||||
@ -558,6 +562,7 @@ int main(void)
 | 
				
			|||||||
        gRMS.use();
 | 
					        gRMS.use();
 | 
				
			||||||
        gID.use();
 | 
					        gID.use();
 | 
				
			||||||
        gEmittedColor.use();
 | 
					        gEmittedColor.use();
 | 
				
			||||||
 | 
					        reflections_texture.use();
 | 
				
			||||||
        // Идентификатор выбранного объекта для обводки
 | 
					        // Идентификатор выбранного объекта для обводки
 | 
				
			||||||
        glUniform3uiv(lightShader.getUniformLoc("selectedID"), 1, (GLuint*) &selected);
 | 
					        glUniform3uiv(lightShader.getUniformLoc("selectedID"), 1, (GLuint*) &selected);
 | 
				
			||||||
        // Подключаем текстуры теней
 | 
					        // Подключаем текстуры теней
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user