72 lines
1.3 KiB
GLSL
72 lines
1.3 KiB
GLSL
uniform sampler2D ntex;
|
|
uniform sampler2D ctex;
|
|
uniform vec3 campos;
|
|
uniform int low;
|
|
|
|
in vec3 wpos;
|
|
in vec2 texc;
|
|
out vec4 FragColor;
|
|
|
|
float luminanceImp()
|
|
{
|
|
// A full-res fetch kills on low-end
|
|
if (low > 0) return 1.0;
|
|
|
|
const vec3 weights = vec3(0.2126, 0.7152, 0.0722); // ITU-R BT. 709
|
|
vec3 col = texture(ctex, texc).xyz;
|
|
|
|
float luma = dot(weights, col);
|
|
|
|
// Dark surfaces need less resolution
|
|
float f = smoothstep(0.1, 0.4, luma);
|
|
f = max(0.05, f);
|
|
|
|
return f;
|
|
}
|
|
|
|
float normalImp(vec3 normal)
|
|
{
|
|
vec3 camdir = normalize(campos - wpos);
|
|
vec3 N = normalize(normal);
|
|
|
|
// Boost surfaces facing the viewer directly
|
|
float f = 2.0 * max(0.0, dot(N, camdir));
|
|
|
|
return f;
|
|
}
|
|
|
|
float depthImp(float linearz)
|
|
{
|
|
/* const float skip = 0.7;
|
|
|
|
float f = min(linearz, skip);
|
|
f *= 1.0/skip;*/
|
|
|
|
float z = log(1.0 + linearz * 9.0) / log(10.0);
|
|
|
|
float f = 1.0 - (z * 0.9);
|
|
|
|
return f;
|
|
}
|
|
|
|
void main()
|
|
{
|
|
vec4 ntmp = texture(ntex, texc);
|
|
vec3 normal = ntmp.xyz * 2.0 - 1.0;
|
|
float linearz = ntmp.a;
|
|
|
|
float importance = normalImp(normal) * depthImp(linearz) * luminanceImp();
|
|
importance = clamp(importance, 0.0, 1.0);
|
|
|
|
float low = step(0.001, importance);
|
|
|
|
// Quantize it
|
|
const float steps = 16.0;
|
|
importance *= steps;
|
|
importance = ceil(importance) * low;
|
|
importance /= steps;
|
|
|
|
FragColor = vec4(importance);
|
|
gl_FragDepth = 1.0 - importance;
|
|
}
|