diff options
author | Clément Foucault <foucault.clem@gmail.com> | 2017-04-18 13:50:09 +0300 |
---|---|---|
committer | Clément Foucault <foucault.clem@gmail.com> | 2017-04-18 14:10:17 +0300 |
commit | edcf128ce279e1fa721a1ba16fc3a3dfeac4833b (patch) | |
tree | 4317cd33b39f63f90a26c33faf5790b965ebc3cd /source/blender/draw/engines/eevee/shaders/bsdf_sampling_lib.glsl | |
parent | f1fb605ec9ffd69b82652f3702de8b7ada570fd8 (diff) |
Eevee: Introduction of world preconvolved envmap.
For now only compute GGX convolution. The GGX LUT used for the split sum approximation (UE4) is merged with the LTX mag LUT that uses the same parameters (theta and roughness)
Diffstat (limited to 'source/blender/draw/engines/eevee/shaders/bsdf_sampling_lib.glsl')
-rw-r--r-- | source/blender/draw/engines/eevee/shaders/bsdf_sampling_lib.glsl | 54 |
1 files changed, 54 insertions, 0 deletions
diff --git a/source/blender/draw/engines/eevee/shaders/bsdf_sampling_lib.glsl b/source/blender/draw/engines/eevee/shaders/bsdf_sampling_lib.glsl new file mode 100644 index 00000000000..da14a2dfee4 --- /dev/null +++ b/source/blender/draw/engines/eevee/shaders/bsdf_sampling_lib.glsl @@ -0,0 +1,54 @@ + +uniform sampler1D texHammersley; +uniform sampler2D texJitter; +uniform float sampleCount; +uniform float invSampleCount; + +vec2 jitternoise = vec2(0.0); + +void setup_noise(void) +{ + jitternoise = texture(texJitter, gl_FragCoord.xy / NOISE_SIZE, 0).rg; /* Global variable */ +} + +vec3 hammersley_3d(float i, float invsamplenbr) +{ + vec3 Xi; /* Theta, cos(Phi), sin(Phi) */ + + Xi.x = i * invsamplenbr; /* i/samples */ + Xi.x = fract(Xi.x + jitternoise.x); + + int u = int(mod(i + jitternoise.y * HAMMERSLEY_SIZE, HAMMERSLEY_SIZE)); + + Xi.yz = texelFetch(texHammersley, u, 0).rg; + + return Xi; +} + +vec3 hammersley_3d(float i) +{ + return hammersley_3d(i, invSampleCount); +} + +/* -------------- BSDFS -------------- */ + +float pdf_ggx_reflect(float NH, float a2) +{ + return NH * a2 / D_ggx_opti(NH, a2); +} + +vec3 sample_ggx(float nsample, float a2, vec3 N, vec3 T, vec3 B) +{ + vec3 Xi = hammersley_3d(nsample); + + /* Theta is the aperture angle of the cone */ + float z = sqrt( (1.0 - Xi.x) / ( 1.0 + a2 * Xi.x - Xi.x ) ); /* cos theta */ + float r = sqrt( 1.0 - z * z ); /* sin theta */ + float x = r * Xi.y; + float y = r * Xi.z; + + /* Microfacet Normal */ + vec3 Ht = vec3(x, y, z); + + return tangent_to_world(Ht, N, T, B); +} |