Отражения на основании скайбокса
This commit is contained in:
		
							parent
							
								
									17a78d6c05
								
							
						
					
					
						commit
						2ec6349ae1
					
				@ -42,6 +42,7 @@ uniform sampler2DArray sunShadowDepth;
 | 
			
		||||
uniform samplerCubeArray pointShadowDepth;
 | 
			
		||||
uniform sampler2D ssao;
 | 
			
		||||
uniform usampler2D gID;
 | 
			
		||||
uniform samplerCube reflections;
 | 
			
		||||
 | 
			
		||||
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);
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
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() 
 | 
			
		||||
{ 
 | 
			
		||||
    // Получим данные из текстур буфера
 | 
			
		||||
@ -123,6 +141,23 @@ void main()
 | 
			
		||||
    // Если у модели есть нормаль
 | 
			
		||||
    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)
 | 
			
		||||
        {
 | 
			
		||||
 | 
			
		||||
@ -320,12 +320,14 @@ TextureCube::TextureCube(GLuint t, const std::string (&filename)[6])
 | 
			
		||||
    else
 | 
			
		||||
        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_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_R, GL_CLAMP_TO_EDGE);
 | 
			
		||||
 | 
			
		||||
    glGenerateMipmap(GL_TEXTURE_CUBE_MAP);
 | 
			
		||||
 | 
			
		||||
    handler_count[handler]++;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
@ -214,7 +214,7 @@ int main(void)
 | 
			
		||||
    lightShader.load(GL_FRAGMENT_SHADER, "shaders/lighting.frag");
 | 
			
		||||
    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*));
 | 
			
		||||
    // Загрузка данных о границах каскадов
 | 
			
		||||
    glUniform1fv(lightShader.getUniformLoc("camera_cascade_distances"), CAMERA_CASCADE_COUNT, &camera_cascade_distances[1]);
 | 
			
		||||
@ -451,6 +451,10 @@ int main(void)
 | 
			
		||||
    Scale scale;
 | 
			
		||||
    TRS& currentTool = transform; 
 | 
			
		||||
 | 
			
		||||
    // Текстура для отражений скайбокса
 | 
			
		||||
    TextureCube reflections_texture(skybox_texture);
 | 
			
		||||
    reflections_texture.setType(9);
 | 
			
		||||
 | 
			
		||||
    // Пока не произойдет событие запроса закрытия окна
 | 
			
		||||
    while(!glfwWindowShouldClose(window))
 | 
			
		||||
    {
 | 
			
		||||
@ -558,6 +562,7 @@ int main(void)
 | 
			
		||||
        gRMS.use();
 | 
			
		||||
        gID.use();
 | 
			
		||||
        gEmittedColor.use();
 | 
			
		||||
        reflections_texture.use();
 | 
			
		||||
        // Идентификатор выбранного объекта для обводки
 | 
			
		||||
        glUniform3uiv(lightShader.getUniformLoc("selectedID"), 1, (GLuint*) &selected);
 | 
			
		||||
        // Подключаем текстуры теней
 | 
			
		||||
 | 
			
		||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user