From 76f320e95662de53d420669301db56010f2f4f00 Mon Sep 17 00:00:00 2001 From: Hugo Willaume Date: Mon, 8 Apr 2019 14:09:22 +0900 Subject: [PATCH] Dynamic ReflectFactor through Shilick's approximation of Fresnel's equation --- BaseGLProject/MyGLWindow.cpp | 3 +-- BaseGLProject/skybox.frag | 16 +++++++++------- BaseGLProject/skybox.vert | 6 ++++++ 3 files changed, 16 insertions(+), 9 deletions(-) diff --git a/BaseGLProject/MyGLWindow.cpp b/BaseGLProject/MyGLWindow.cpp index 78dd178..a890747 100644 --- a/BaseGLProject/MyGLWindow.cpp +++ b/BaseGLProject/MyGLWindow.cpp @@ -110,8 +110,7 @@ void MyGlWindow::shaderSetup() shaders["Toon"]->uniformFlags &= ~ShaderFlags::SHINE_FLAG; shaders["Skybox"] = new Shader("skybox.vert", "skybox.frag"); - shaders["Skybox"]->uniformFlags = MVP_FLAG | MODEL_MATRIX_FLAG | SKYBOX_TEX_FLAG; - shaders["Skybox"]->addUniform("ReflectFactor", (float)0.1); + shaders["Skybox"]->uniformFlags = MVP_FLAG | MODEL_MATRIX_FLAG | SKYBOX_TEX_FLAG; shaders["Skybox"]->addUniform("RefractionIndex", glm::vec3(0.65, 0.67, 0.69)); } diff --git a/BaseGLProject/skybox.frag b/BaseGLProject/skybox.frag index e571766..f11dbc1 100644 --- a/BaseGLProject/skybox.frag +++ b/BaseGLProject/skybox.frag @@ -8,19 +8,21 @@ in vec3 refractDir_R; in vec3 refractDir_G; in vec3 refractDir_B; -uniform float ReflectFactor; +in float reflectFactor; uniform bool DrawSkyBox; uniform samplerCube CubeMapTex; void main() { - vec4 reflectColor = texture(CubeMapTex, reflectDir); - float refractColor_R = texture(CubeMapTex, refractDir_R).r; - float refractColor_G = texture(CubeMapTex, refractDir_G).g; - float refractColor_B = texture(CubeMapTex, refractDir_B).b; - vec4 refractColor = vec4(refractColor_R, refractColor_G, refractColor_B, 1); + vec4 reflectColor = texture(CubeMapTex, reflectDir); if (DrawSkyBox == true) FragColors = reflectColor; else - FragColors = vec4(mix(refractColor, reflectColor, ReflectFactor)); + { + float refractColor_R = texture(CubeMapTex, refractDir_R).r; + float refractColor_G = texture(CubeMapTex, refractDir_G).g; + float refractColor_B = texture(CubeMapTex, refractDir_B).b; + vec4 refractColor = vec4(refractColor_R, refractColor_G, refractColor_B, 1); + FragColors = vec4(mix(refractColor, reflectColor, reflectFactor)); + } } diff --git a/BaseGLProject/skybox.vert b/BaseGLProject/skybox.vert index 705aa0e..459ad0d 100644 --- a/BaseGLProject/skybox.vert +++ b/BaseGLProject/skybox.vert @@ -6,6 +6,8 @@ layout(location=2) in vec3 v_color; layout(location=3) in vec2 v_texmap; out vec3 reflectDir; +out float reflectFactor; + out vec3 refractDir_R; out vec3 refractDir_G; out vec3 refractDir_B; @@ -28,6 +30,10 @@ void main(void) vec3 P = (ModelMatrix * vec4(coord3d, 1)).xyz; vec3 N = normalize(ModelMatrix * vec4(v_normal, 1)).xyz; vec3 V = normalize(WorldCamPos - coord3d); + + float R0 = pow(1 - 1.5,2) / pow(1 + 1.5, 2); + reflectFactor = R0 + (1 - R0) * pow(1 - dot(V, N), 5); + reflectDir = reflect(-V, N); refractDir_R = refract(-V, N, RefractionIndex.r); refractDir_G = refract(-V, N, RefractionIndex.g);