• Advertisement
Sign in to follow this  

Screen Space Reflection Streaking

Recommended Posts


Im trying to implement some very simple screen space reflections. Right now I have everything working, except there are some pretty noticeable artifacts. Here is an image of the reflection buffer with the artifact shown. I've outlined the actual geometry extents in red so that its more obvious because this is the reflection buffer only. The noise is intentional, I'm either going to blur it out later, bur right now Im concentrated on getting the reflections themselves to look right.


As you can see there are "streaks" that optimally should not be there. My guess is that the ray is facing away from the camera and is actually moving behind the objects but since the ray position is then less than the depth of the object it is reflected.  If an object isn't touching the plane it is reflecting on the streaking becomes much more noticeable.  Does anyone have any ideas on what I can do to fix this? 





Here is my code if there is a chance that its an issue with that 

vec2 binarySearch(vec3 last, vec3 current) {
	vec3 ray_min = last;
	vec3 ray_max = current;
	vec3 ray_mid;
	for (int i = 0; i < 10; i++) {
		ray_mid = mix(ray_min, ray_max, 0.5);
		float depth = texture(tex_depth, ray_mid.xy).r;
		if (ray_mid.z > depth)
			ray_max = ray_mid;
		else ray_min = ray_max;
	return ray_mid.xy;

void main() {

	// Get the normal
	vec3 normal = texture(tex_normal, tex_coord0).rgb;
	// Calculate world space position
	float depth = texture(tex_depth, tex_coord0).x;
	vec4 position_p = vec4(tex_coord0 * 2.0 - 1.0, depth * 2.0 - 1.0, 1.0);
	position_p = inverse_proj_view * position_p;
	vec3 position = (position_p / position_p.w).xyz;

	// Get the reflection vector
	vec3 V = normalize(position - view_position);
	vec3 reflection_vector = reflect(V, normal);
	vec4 reflection_pos = mat_view_proj * vec4(position + reflection_vector, 1.0);
	reflection_pos = reflection_pos / reflection_pos.w;
	vec3 reflection_pos_s = reflection_pos.xyz * 0.5 + 0.5;
	// Calculate a jitter to add some noise
	float c = (tex_coord0.x * 14400.0 + tex_coord0.y * 8500.0) * 0.25;
	float jitter = mod( c, 1.0);
	vec3 NDC = vec3(tex_coord0, depth);
	vec3 ray_direction = normalize(reflection_pos_s - NDC) * jitter;
	vec3 last_ray_step = NDC;
	vec3 reflection_color;
	for (int i = 0; i < 16; i++) {
		vec3 ray_step = last_ray_step + ray_direction * 0.04;
		float depth_ray = texture(tex_depth, ray_step.xy).r;
		if (depth_ray < ray_step.z) {
			reflection_color = texture(tex_albedo, binarySearch(last_ray_step, ray_step)).rgb;
		last_ray_step = ray_step;
	reflection = reflection_color * (1 - smoothstep(0.25, 0.5, dot(-V, reflection_vector)));


Edited by BlueSpud

Share this post

Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

Sign in to follow this  

  • Advertisement