From 2ec6349ae113e83274a2eae5946a97b3636027ee Mon Sep 17 00:00:00 2001 From: "R.E. Kovalev" Date: Thu, 22 Jun 2023 22:17:18 +0300 Subject: [PATCH] =?UTF-8?q?=D0=9E=D1=82=D1=80=D0=B0=D0=B6=D0=B5=D0=BD?= =?UTF-8?q?=D0=B8=D1=8F=20=D0=BD=D0=B0=20=D0=BE=D1=81=D0=BD=D0=BE=D0=B2?= =?UTF-8?q?=D0=B0=D0=BD=D0=B8=D0=B8=20=D1=81=D0=BA=D0=B0=D0=B9=D0=B1=D0=BE?= =?UTF-8?q?=D0=BA=D1=81=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- shaders/lighting.frag | 35 +++++++++++++++++++++++++++++++++++ src/Texture.cpp | 4 +++- src/main.cpp | 7 ++++++- 3 files changed, 44 insertions(+), 2 deletions(-) diff --git a/shaders/lighting.frag b/shaders/lighting.frag index 1ceb1ba..352e0cc 100644 --- a/shaders/lighting.frag +++ b/shaders/lighting.frag @@ -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) { diff --git a/src/Texture.cpp b/src/Texture.cpp index f48cb45..58e00fa 100644 --- a/src/Texture.cpp +++ b/src/Texture.cpp @@ -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]++; } diff --git a/src/main.cpp b/src/main.cpp index 4fb140b..986b4b5 100755 --- a/src/main.cpp +++ b/src/main.cpp @@ -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); // Подключаем текстуры теней