Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #version 330
- precision highp float;
- #include "SharedGLSL.h"
- in vec2 ex_TexCoord;
- layout(location = 0) out vec4 out_Faces[6];
- uniform samplerCube uEnvCubeMap;
- uniform float uRoughness;
- float radicalInverse_VdC(uint bits)
- {
- bits = (bits << 16u) | (bits >> 16u);
- bits = ((bits & 0x55555555u) << 1u) | ((bits & 0xAAAAAAAAu) >> 1u);
- bits = ((bits & 0x33333333u) << 2u) | ((bits & 0xCCCCCCCCu) >> 2u);
- bits = ((bits & 0x0F0F0F0Fu) << 4u) | ((bits & 0xF0F0F0F0u) >> 4u);
- bits = ((bits & 0x00FF00FFu) << 8u) | ((bits & 0xFF00FF00u) >> 8u);
- return float(bits) * 2.3283064365386963e-10; // / 0x100000000
- }
- // Hammersley function (return random low-discrepency points)
- vec2 Hammersley(uint i, uint N)
- {
- return vec2(float(i) / float(N), float(radicalInverse_VdC(i)));
- }
- vec3 ImportanceSampleGGX( vec2 Xi, float Roughness, vec3 N )
- {
- float a = Roughness * Roughness;
- float Phi = 2 * M_PI * Xi.x;
- float CosTheta = sqrt( (1 - Xi.y) / ( 1 + (a*a - 1) * Xi.y ) );
- float SinTheta = sqrt( 1 - CosTheta * CosTheta );
- vec3 H;
- H.x = SinTheta * cos( Phi );
- H.y = SinTheta * sin( Phi );
- H.z = CosTheta;
- vec3 UpVector = abs(N.z) < 0.999 ? vec3(0,0,1) : vec3(1,0,0);
- vec3 TangentX = normalize( cross( UpVector, N ) );
- vec3 TangentY = cross( N, TangentX );
- // Tangent to world space
- return TangentX * H.x + TangentY * H.y + N * H.z;
- }
- vec3 PrefilterEnvMap( float Roughness, vec3 R )
- {
- vec3 N = R;
- vec3 V = R;
- vec3 PrefilteredColor = vec3(0.0);
- float TotalWeight = 0.0;
- const uint NumSamples = 2048u;
- for( uint i = 0u; i < NumSamples; i++ )
- {
- vec2 Xi = Hammersley( i, NumSamples );
- vec3 H = ImportanceSampleGGX( Xi, Roughness, N );
- vec3 L = 2 * dot( V, H ) * H - V;
- float NoL = clamp( dot( N, L ), 0, 1 );
- if( NoL > 0 )
- {
- PrefilteredColor += textureLod( uEnvCubeMap , L, 0 ).rgb * NoL;
- TotalWeight += NoL;
- }
- }
- return PrefilteredColor / TotalWeight;
- }
- void main(void)
- {
- vec2 pos = ex_TexCoord.xy;
- pos = -1.0 + (2.0 * pos);
- vec3 faceNormals[6] = vec3[6](normalize( vec3(1.0, -pos.y, -pos.x) ),
- normalize( vec3(-1.0, -pos.y, pos.x) ),
- normalize( vec3(pos.x, 1.0, pos.y) ),
- normalize( vec3(pos.x, -1.0, -pos.y) ),
- normalize( vec3(pos.x, -pos.y, 1.0) ),
- normalize( vec3(-pos.x, -pos.y, -1.0) ));
- for (int faceId = 0; faceId < 6; faceId++)
- {
- vec3 normal = faceNormals[faceId];
- out_Faces[faceId] = vec4( PrefilterEnvMap(uRoughness, normal), 1.0);
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement