uniform PrecalcParams { int n_samples; float roughness; }; uniform samplerCube environment_map; vec2 hammersley(int i, int count) { float y = bitfieldReverse(uint(i))*2.3283064e-10; return vec2(float(i)/count, y); } vec3 uv_to_hemisphere(float u, float v) { float phi = u*2.0*PI; float r = sqrt(1.0-v*v); return vec3(cos(phi)*r, sin(phi)*r, v); } vec3 ndist_ggxtr_importance_sample(vec2 uv, float roughness) { float rough_q = roughness*roughness; rough_q *= rough_q; float v = sqrt((1.0-uv.y)/(1.0+(rough_q-1.0)*uv.y)); return uv_to_hemisphere(uv.x, v); }