mirror of
https://github.com/godotengine/godot.git
synced 2025-12-07 22:00:10 +00:00
49 lines
1.3 KiB
GLSL
49 lines
1.3 KiB
GLSL
#define M_PI 3.14159265359
|
|
|
|
layout(push_constant, std430) uniform Params {
|
|
uint sample_count;
|
|
float roughness;
|
|
uint source_size;
|
|
uint dest_size;
|
|
|
|
vec2 border_size;
|
|
bool use_direct_write;
|
|
uint pad;
|
|
}
|
|
params;
|
|
|
|
vec3 ImportanceSampleGGX(vec2 xi, float roughness4) {
|
|
// Compute distribution direction
|
|
float Phi = 2.0 * M_PI * xi.x;
|
|
float CosTheta = sqrt((1.0 - xi.y) / (1.0 + (roughness4 - 1.0) * xi.y));
|
|
float SinTheta = sqrt(1.0 - CosTheta * CosTheta);
|
|
|
|
// Convert to spherical direction
|
|
vec3 H;
|
|
H.x = SinTheta * cos(Phi);
|
|
H.y = SinTheta * sin(Phi);
|
|
H.z = CosTheta;
|
|
|
|
return H;
|
|
}
|
|
|
|
float DistributionGGX(float NdotH, float roughness4) {
|
|
float NdotH2 = NdotH * NdotH;
|
|
float denom = (NdotH2 * (roughness4 - 1.0) + 1.0);
|
|
denom = M_PI * denom * denom;
|
|
|
|
return roughness4 / denom;
|
|
}
|
|
|
|
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
|
|
}
|
|
|
|
vec2 Hammersley(uint i, uint N) {
|
|
return vec2(float(i) / float(N), radicalInverse_VdC(i));
|
|
}
|