Отражения на основании скайбокса
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…
Reference in New Issue