Display: restore intersection and cusp highlighting
This increases resource use a bit, because we now have to hold two fragments in memory at once instead of just one. It's still much better than holding all of the top twelve fragments, though!
This commit is contained in:
parent
ee1c691787
commit
abe231126d
@ -191,19 +191,44 @@ void main() {
|
|||||||
// composite the sphere fragments
|
// composite the sphere fragments
|
||||||
vec3 color = vec3(0.);
|
vec3 color = vec3(0.);
|
||||||
int layer = layer_cnt - 1;
|
int layer = layer_cnt - 1;
|
||||||
TaggedDepth hit;
|
TaggedDepth hit = top_hits[layer];
|
||||||
for (; layer >= layer_threshold; --layer) {
|
Fragment frag_next = sphere_shading(
|
||||||
// shade the current fragment
|
|
||||||
hit = top_hits[layer];
|
|
||||||
Fragment frag = sphere_shading(
|
|
||||||
sphere_list[hit.id],
|
sphere_list[hit.id],
|
||||||
hit.depth * dir,
|
hit.depth * dir,
|
||||||
hit.dimming * color_list[hit.id]
|
hit.dimming * color_list[hit.id]
|
||||||
);
|
);
|
||||||
float highlight = highlight_list[hit.id];
|
float highlight_next = highlight_list[hit.id];
|
||||||
|
--layer;
|
||||||
|
for (; layer >= layer_threshold; --layer) {
|
||||||
|
// load the current fragment
|
||||||
|
Fragment frag = frag_next;
|
||||||
|
float highlight = highlight_next;
|
||||||
|
|
||||||
|
// shade the next fragment
|
||||||
|
hit = top_hits[layer];
|
||||||
|
frag_next = sphere_shading(
|
||||||
|
sphere_list[hit.id],
|
||||||
|
hit.depth * dir,
|
||||||
|
hit.dimming * color_list[hit.id]
|
||||||
|
);
|
||||||
|
highlight_next = highlight_list[hit.id];
|
||||||
|
|
||||||
|
// highlight intersections
|
||||||
|
float ixn_dist = intersection_dist(frag, frag_next);
|
||||||
|
float max_highlight = max(highlight, highlight_next);
|
||||||
|
float ixn_highlight = 0.5 * max_highlight * (1. - smoothstep(2./3.*ixn_threshold, 1.5*ixn_threshold, ixn_dist));
|
||||||
|
frag.color = mix(frag.color, vec4(1.), ixn_highlight);
|
||||||
|
frag_next.color = mix(frag_next.color, vec4(1.), ixn_highlight);
|
||||||
|
|
||||||
|
// highlight cusps
|
||||||
|
float cusp_cos = abs(dot(dir, frag.normal));
|
||||||
|
float cusp_threshold = 2.*sqrt(ixn_threshold * sphere_list[hit.id].lt.s);
|
||||||
|
float cusp_highlight = highlight * (1. - smoothstep(2./3.*cusp_threshold, 1.5*cusp_threshold, cusp_cos));
|
||||||
|
frag.color = mix(frag.color, vec4(1.), cusp_highlight);
|
||||||
|
|
||||||
// composite the current fragment
|
// composite the current fragment
|
||||||
color = mix(color, frag.color.rgb, frag.color.a);
|
color = mix(color, frag.color.rgb, frag.color.a);
|
||||||
}
|
}
|
||||||
|
color = mix(color, frag_next.color.rgb, frag_next.color.a);
|
||||||
outColor = vec4(sRGB(color), 1.);
|
outColor = vec4(sRGB(color), 1.);
|
||||||
}
|
}
|
Loading…
Reference in New Issue
Block a user