Jump to content

  • Log In with Google      Sign In   
  • Create Account


Member Since 23 Jan 2006
Offline Last Active Dec 07 2013 12:40 PM

#5014882 GPU voxelization - Conservative rasterization issue.

Posted by elurahu on 27 December 2012 - 04:44 PM

First of all - Thank you for your answer.


I agree that having orthographic projects makes alot of stuff easiere as I can just extend the clipspace vertices directly. The problem lies in HOW much to extend. The article outlines that you'll need to extend along the worst-case semidiagonal. The author uses the fact that a line in clipspace can be represented as a plane through the camera (0,0,0) in projected space and then dilutes along the plane normal - Then to find the new vertex positions they do a plane - plane intersection using a cross product.


I just don't think this works for orthographic projects as all points on a direction vector from the origin doesn't project to a single point.


For reference here my geometry code for the impl.


	// Triangle bounding box.
	vec4 f4AABB;

	// Compute v0.
	vec4 f4CSV0 = m4ViewProj * RF_WORLD * gl_in[0].gl_Position;
	f4AABB.xy = f4CSV0.xy;
	f4AABB.zw = f4CSV0.xy;
	// Compute v1.
	vec4 f4CSV1 = m4ViewProj * RF_WORLD * gl_in[1].gl_Position;
	f4AABB.xy = min(f4AABB.xy, f4CSV1.xy);
	f4AABB.zw = max(f4AABB.zw, f4CSV1.xy);

	// Compute v2.
	vec4 f4CSV2 = m4ViewProj * RF_WORLD * gl_in[2].gl_Position;
	f4AABB.xy = min(f4AABB.xy, f4CSV2.xy);
	f4AABB.zw = max(f4AABB.zw, f4CSV2.xy);

	// Extend and set AABB.
	f4AABB.xy -= vec2(fHalfPixel);
	f4AABB.zw += vec2(fHalfPixel);
	// Compute dialated edges.
	vec3 f3Plane[3];
	f3Plane[0] = cross(f4CSV0.xyw - f4CSV2.xyw, f4CSV2.xyw);
	f3Plane[1] = cross(f4CSV1.xyw - f4CSV0.xyw, f4CSV0.xyw);
	f3Plane[2] = cross(f4CSV2.xyw - f4CSV1.xyw, f4CSV1.xyw);
	f3Plane[0].z -= dot(vec2(fHalfPixel), abs(f3Plane[0].xy));
	f3Plane[1].z -= dot(vec2(fHalfPixel), abs(f3Plane[1].xy));
	f3Plane[2].z -= dot(vec2(fHalfPixel), abs(f3Plane[2].xy));
	// Compute plane intersections.
	f4CSV0.xyw = cross(f3Plane[0], f3Plane[1]);
	f4CSV1.xyw = cross(f3Plane[1], f3Plane[2]);
	f4CSV2.xyw = cross(f3Plane[2], f3Plane[0]);
	// Emit vertex data.
	OUT.f3CSPosition = m3Rotation * (f4CSV0.xyz / f4CSV0.w);
	OUT.f3Color = f3Color;
	gl_Position = f4CSV0;
	OUT.f3CSPosition = m3Rotation * (f4CSV1.xyz / f4CSV1.w);
	OUT.f3Color = f3Color;
	gl_Position = f4CSV1;
	OUT.f3CSPosition = m3Rotation * (f4CSV2.xyz / f4CSV2.w);
	OUT.f3Color = f3Color;
	gl_Position = f4CSV2;