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