Advertisement
Guest User

Untitled

a guest
May 25th, 2018
92
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. #version 330
  2. precision highp float;
  3.  
  4. #include "SharedGLSL.h"
  5.        
  6. in  vec2 ex_TexCoord;
  7.  
  8. layout(location = 0) out vec4 out_Faces[6];
  9.  
  10. uniform samplerCube uEnvCubeMap;
  11. uniform float uRoughness;
  12.  
  13.  
  14. float radicalInverse_VdC(uint bits)
  15. {
  16.     bits = (bits << 16u) | (bits >> 16u);
  17.     bits = ((bits & 0x55555555u) << 1u) | ((bits & 0xAAAAAAAAu) >> 1u);
  18.     bits = ((bits & 0x33333333u) << 2u) | ((bits & 0xCCCCCCCCu) >> 2u);
  19.     bits = ((bits & 0x0F0F0F0Fu) << 4u) | ((bits & 0xF0F0F0F0u) >> 4u);
  20.     bits = ((bits & 0x00FF00FFu) << 8u) | ((bits & 0xFF00FF00u) >> 8u);
  21.     return float(bits) * 2.3283064365386963e-10; // / 0x100000000
  22. }
  23.        
  24. // Hammersley function (return random low-discrepency points)
  25. vec2 Hammersley(uint i, uint N)
  26. {
  27.     return vec2(float(i) / float(N), float(radicalInverse_VdC(i)));
  28. }
  29.  
  30. vec3 ImportanceSampleGGX( vec2 Xi, float Roughness, vec3 N )
  31. {
  32.     float a = Roughness * Roughness;
  33.     float Phi = 2 * M_PI * Xi.x;
  34.     float CosTheta = sqrt( (1 - Xi.y) / ( 1 + (a*a - 1) * Xi.y ) );
  35.     float SinTheta = sqrt( 1 - CosTheta * CosTheta );
  36.     vec3 H;
  37.     H.x = SinTheta * cos( Phi );
  38.     H.y = SinTheta * sin( Phi );
  39.     H.z = CosTheta;
  40.     vec3 UpVector = abs(N.z) < 0.999 ? vec3(0,0,1) : vec3(1,0,0);
  41.     vec3 TangentX = normalize( cross( UpVector, N ) );
  42.     vec3 TangentY = cross( N, TangentX );
  43.    
  44.     // Tangent to world space
  45.     return TangentX * H.x + TangentY * H.y + N * H.z;
  46. }
  47.  
  48. vec3 PrefilterEnvMap( float Roughness, vec3 R )
  49. {
  50.     vec3 N = R;
  51.     vec3 V = R;
  52.     vec3 PrefilteredColor = vec3(0.0);
  53.     float TotalWeight = 0.0;
  54.     const uint NumSamples = 2048u;
  55.     for( uint i = 0u; i < NumSamples; i++ )
  56.     {
  57.         vec2 Xi = Hammersley( i, NumSamples );
  58.         vec3 H = ImportanceSampleGGX( Xi, Roughness, N );
  59.         vec3 L = 2 * dot( V, H ) * H - V;
  60.         float NoL = clamp( dot( N, L ), 0, 1 );
  61.         if( NoL > 0 )
  62.         {
  63.             PrefilteredColor += textureLod( uEnvCubeMap , L, 0 ).rgb * NoL;
  64.             TotalWeight += NoL;
  65.         }
  66.     }
  67.     return PrefilteredColor / TotalWeight;
  68. }
  69.  
  70. void main(void)
  71. {
  72.     vec2 pos = ex_TexCoord.xy;
  73.     pos = -1.0 + (2.0 * pos);
  74.     vec3 faceNormals[6] = vec3[6](normalize( vec3(1.0, -pos.y, -pos.x) ),
  75.                                   normalize( vec3(-1.0, -pos.y, pos.x) ),
  76.                                   normalize( vec3(pos.x, 1.0, pos.y) ),
  77.                                   normalize( vec3(pos.x, -1.0, -pos.y) ),
  78.                                   normalize( vec3(pos.x, -pos.y, 1.0) ),
  79.                                   normalize( vec3(-pos.x, -pos.y, -1.0) ));
  80.    
  81.     for (int faceId = 0; faceId < 6; faceId++)
  82.     {
  83.         vec3 normal = faceNormals[faceId];
  84.         out_Faces[faceId] = vec4( PrefilterEnvMap(uRoughness, normal), 1.0);
  85.     }
  86. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement