/*******************************************************************************************
							 | 
						|
								*
							 | 
						|
								*   rPBR [shader] - Irradiance cubemap fragment shader
							 | 
						|
								*
							 | 
						|
								*   Copyright (c) 2017 Victor Fisac
							 | 
						|
								*
							 | 
						|
								**********************************************************************************************/
							 | 
						|
								
							 | 
						|
								#version 330
							 | 
						|
								
							 | 
						|
								// Input vertex attributes (from vertex shader)
							 | 
						|
								in vec3 fragPos;
							 | 
						|
								
							 | 
						|
								// Input uniform values
							 | 
						|
								uniform samplerCube environmentMap;
							 | 
						|
								
							 | 
						|
								// Constant values
							 | 
						|
								const float PI = 3.14159265359f;
							 | 
						|
								
							 | 
						|
								// Output fragment color
							 | 
						|
								out vec4 finalColor;
							 | 
						|
								
							 | 
						|
								void main()
							 | 
						|
								{
							 | 
						|
								    // The sample direction equals the hemisphere's orientation
							 | 
						|
								    vec3 normal = normalize(fragPos);
							 | 
						|
								
							 | 
						|
								    vec3 irradiance = vec3(0.0);  
							 | 
						|
								
							 | 
						|
								    vec3 up = vec3(0.0, 1.0, 0.0);
							 | 
						|
								    vec3 right = cross(up, normal);
							 | 
						|
								    up = cross(normal, right);
							 | 
						|
								
							 | 
						|
								    float sampleDelta = 0.025f;
							 | 
						|
								    float nrSamples = 0.0f; 
							 | 
						|
								
							 | 
						|
								    for (float phi = 0.0; phi < 2.0*PI; phi += sampleDelta)
							 | 
						|
								    {
							 | 
						|
								        for (float theta = 0.0; theta < 0.5*PI; theta += sampleDelta)
							 | 
						|
								        {
							 | 
						|
								            // Spherical to cartesian (in tangent space)
							 | 
						|
								            vec3 tangentSample = vec3(sin(theta)*cos(phi), sin(theta)*sin(phi), cos(theta));
							 | 
						|
								            
							 | 
						|
								            // tangent space to world
							 | 
						|
								            vec3 sampleVec = tangentSample.x*right + tangentSample.y*up + tangentSample.z*normal; 
							 | 
						|
								
							 | 
						|
								            // Fetch color from environment cubemap
							 | 
						|
								            irradiance += texture(environmentMap, sampleVec).rgb*cos(theta)*sin(theta);
							 | 
						|
								            nrSamples++;
							 | 
						|
								        }
							 | 
						|
								    }
							 | 
						|
								
							 | 
						|
								    // Calculate irradiance average value from samples
							 | 
						|
								    irradiance = PI*irradiance*(1.0/float(nrSamples));
							 | 
						|
								
							 | 
						|
								    // Calculate final fragment color
							 | 
						|
								    finalColor = vec4(irradiance, 1.0);
							 | 
						|
								}
							 |