Отражения на основании скайбокса

This commit is contained in:
Ковалев Роман Евгеньевич 2023-06-22 22:17:18 +03:00 committed by re.kovalev
parent 17a78d6c05
commit 2ec6349ae1
3 changed files with 44 additions and 2 deletions

View File

@ -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)
{ {

View File

@ -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]++;
} }

View File

@ -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);
// Подключаем текстуры теней // Подключаем текстуры теней