diff --git a/src/6.pbr/2.1.2.ibl_irradiance/2.1.2.background.frag b/src/6.pbr/2.1.2.ibl_irradiance/2.1.2.background.frag new file mode 100644 index 0000000..2d4d5b5 --- /dev/null +++ b/src/6.pbr/2.1.2.ibl_irradiance/2.1.2.background.frag @@ -0,0 +1,16 @@ +#version 330 core +out vec4 FragColor; +in vec3 WorldPos; + +uniform samplerCube environmentMap; + +void main() +{ + vec3 envColor = texture(environmentMap, WorldPos).rgb; + + // HDR tonemap and gamma correct + envColor = envColor / (envColor + vec3(1.0)); + envColor = pow(envColor, vec3(1.0/2.2)); + + FragColor = vec4(envColor, 1.0); +} diff --git a/src/6.pbr/2.1.2.ibl_irradiance/2.1.2.background.vs b/src/6.pbr/2.1.2.ibl_irradiance/2.1.2.background.vs new file mode 100644 index 0000000..7de70de --- /dev/null +++ b/src/6.pbr/2.1.2.ibl_irradiance/2.1.2.background.vs @@ -0,0 +1,17 @@ +#version 330 core +layout (location = 0) in vec3 pos; + +uniform mat4 projection; +uniform mat4 view; + +out vec3 WorldPos; + +void main() +{ + WorldPos = pos; + + mat4 rotView = mat4(mat3(view)); + vec4 clipPos = projection * rotView * vec4(WorldPos, 1.0); + + gl_Position = clipPos.xyww; +} \ No newline at end of file diff --git a/src/6.pbr/2.1.2.ibl_irradiance/2.1.2.cubemap.vs b/src/6.pbr/2.1.2.ibl_irradiance/2.1.2.cubemap.vs new file mode 100644 index 0000000..a7ae633 --- /dev/null +++ b/src/6.pbr/2.1.2.ibl_irradiance/2.1.2.cubemap.vs @@ -0,0 +1,14 @@ +#version 330 core +layout (location = 0) in vec3 pos; + +out vec3 WorldPos; + +uniform mat4 projection; +uniform mat4 view; + +void main() +{ + WorldPos = pos; + + gl_Position = projection * view * vec4(WorldPos, 1.0); +} \ No newline at end of file diff --git a/src/6.pbr/2.1.2.ibl_irradiance/2.1.2.equirectangular_to_cubemap.frag b/src/6.pbr/2.1.2.ibl_irradiance/2.1.2.equirectangular_to_cubemap.frag new file mode 100644 index 0000000..cee67e6 --- /dev/null +++ b/src/6.pbr/2.1.2.ibl_irradiance/2.1.2.equirectangular_to_cubemap.frag @@ -0,0 +1,22 @@ +#version 330 core +out vec4 FragColor; +in vec3 WorldPos; + +uniform sampler2D equirectangularMap; + +const vec2 invAtan = vec2(0.1591, 0.3183); +vec2 SampleSphericalMap(vec3 v) +{ + vec2 uv = vec2(atan(v.z, v.x), asin(v.y)); + uv *= invAtan; + uv += 0.5; + return uv; +} + +void main() +{ + vec2 uv = SampleSphericalMap(normalize(WorldPos)); + vec3 color = texture(equirectangularMap, uv).rgb; + + FragColor = vec4(color, 1.0); +} diff --git a/src/6.pbr/2.1.2.ibl_irradiance/ibl_irradiance.cpp b/src/6.pbr/2.1.2.ibl_irradiance/ibl_irradiance.cpp index f5ed6aa..68b5a62 100644 --- a/src/6.pbr/2.1.2.ibl_irradiance/ibl_irradiance.cpp +++ b/src/6.pbr/2.1.2.ibl_irradiance/ibl_irradiance.cpp @@ -78,9 +78,9 @@ int main() // load and initialize shaders // ---------------------- Shader pbrShader("2.1.2.pbr.vs", "2.1.2.pbr.frag"); - Shader equirectangularToCubemapShader("2.1.1.cubemap.vs", "2.1.1.equirectangular_to_cubemap.frag"); - Shader irradianceShader("2.1.1.cubemap.vs", "2.1.2.irradiance_convolution.frag"); - Shader backgroundShader("2.1.1.background.vs", "2.1.1.background.frag"); + Shader equirectangularToCubemapShader("2.1.2.cubemap.vs", "2.1.2.equirectangular_to_cubemap.frag"); + Shader irradianceShader("2.1.2.cubemap.vs", "2.1.2.irradiance_convolution.frag"); + Shader backgroundShader("2.1.2.background.vs", "2.1.2.background.frag"); pbrShader.Use(); glUniform1i(glGetUniformLocation(pbrShader.Program, "irradianceMap"), 0);