X-Git-Url: http://git.tdb.fi/?a=blobdiff_plain;f=builtin_data%2F_pbr_fresnel_lookup.glsl;fp=builtin_data%2F_pbr_fresnel_lookup.glsl;h=0ba97072ac2402a632049b0958af0fca096a8250;hb=e05c77d2e3582a6962f42dcec0fc5f7845ff448d;hp=0000000000000000000000000000000000000000;hpb=a5ad626b8f81de441f81847bfc859d742d8be4ba;p=libs%2Fgl.git diff --git a/builtin_data/_pbr_fresnel_lookup.glsl b/builtin_data/_pbr_fresnel_lookup.glsl new file mode 100644 index 00000000..0ba97072 --- /dev/null +++ b/builtin_data/_pbr_fresnel_lookup.glsl @@ -0,0 +1,43 @@ +import _pbr_prefilter; + +#pragma MSP stage(vertex) +layout(location=0) in vec4 vertex; +void main() +{ + gl_Position = vertex; + out vec2 texcoord = vertex.xy*0.5+0.5; +} + +#pragma MSP stage(fragment) +layout(location=0) out vec2 frag_out; +void main() +{ + vec3 normal = vec3(0.0, 0.0, 1.0); + vec3 look_dir = vec3(sqrt(1.0-texcoord.y*texcoord.y), 0.0, -texcoord.y); + float roughness = texcoord.x; + + float geom_k = roughness*roughness/2.0; + float geom_look = -look_dir.z/(geom_k-look_dir.z*(1.0-geom_k)); + + vec2 sum = vec2(0.0); + for(int i=0; i0) + { + float geom_light = light_dir.z/(geom_k+light_dir.z*(1.0-geom_k)); + float geom = geom_look*geom_light; + + // Look_dir points towards the surface, so the dot product is negated + float half_dot_look = dot(halfway, look_dir); + float ng = geom*half_dot_look/(halfway.z*look_dir.z); + float a = pow(max(1+half_dot_look, 0.0), 5.0); + + sum += vec2(ng*(1-a), ng*a); + } + } + + frag_out = sum/n_samples; +}