Software z-buffer problem

Started by
2 comments, last by Stonemonkey 15 years, 11 months ago
Hi I am working on a software renderer based on the renderer described here: http://www.devmaster.net/forums/showthread.php?t=1884 I have got to adding a z-buffer but I have a problem with accuracy. Some triangles are showing through when they shouldn't. Here is my code for working out the gradient to use for the Z value:

vec3<float> pv1(v1.mPosition.x,v1.mPosition.y,v1.mPosition.z);
vec3<float> pv2(v2.mPosition.x,v2.mPosition.y,v2.mPosition.z);
vec3<float> pv3(v3.mPosition.x,v3.mPosition.y,v3.mPosition.z);

Plane<float> p(pv1,pv2,pv3);
float dzdx = (-p.a/p.c);
float dzdy = (-p.b/p.c);

float origz =  (v1.mPosition.z + dzdx * (minx - v1.mPosition.x) + dzdy * (miny - v1.mPosition.y));
origz = 1/2 * origz + 1/2;

my z-test is as follows:

if(z < zbuffer[comm]) {
	unsigned char icolour[4];
	icolour[0] = (unsigned char) rcolour[0];
	icolour[1] = (unsigned char) rcolour[1];
	icolour[2] = (unsigned char) rcolour[2];
	icolour[3] = 255;
	memcpy(&framebuffer[comm],icolour,4);
	zbuffer[comm] = z;
}

for each increment of x I adjust z by (when scanning over the triangles bounding box): z += dzdx; and for y: z += dzdy; I have uploaded a screenshot,(using software renderer is in square on the top left, the same thing rendered through OpenGL is in the background). I know there are triangles missing, but thats a different issue. http://img2.freeimagehosting.net/image.php?65ee60069f.png Does anyone have any ideas on what I am doing that is causing it not to be 100% accurate? Thanks Mike
Advertisement
I don't know if this is the reason and your link is broken but are you using perspective correction on the z values? If not then that could possibly be your problem and it's pretty easy to fix, interpolate the reciprocal of each of the vertices z (1.0/vertex.z) value instead of z. You have to change the z buffer comparison to > and you don't need the divide inside the scanloop and you have to clear the z buffer with 0.0

Some people might say that you don't get the precision in some ranges when you use a 1/z buffer but I've not experienced any problems so far but if you want you can use the reciprocal of the interpolated value and stick with the setup (comparison/clearing) you've got already although it does mean you're forced to have 1 divide per pixel test.
Hi

I have been looking into my Z values and gradients. The step value for Z seems to be very small. Could this be causing the accuracy problem?
Here are a few Z values (x y z) and the corrosponding gradients (dzdx dzdy).

Z values 0.998719 0.998312 0.998353
Gradients 2.51788e-05 -8.87677e-06
Z values 0.998719 0.998683 0.998312
Gradients 2.51717e-05 -8.87782e-06
Z values 0.998683 0.998459 0.998312
Gradients -3.2569e-05 -1.35716e-05
Z values 0.998683 0.998812 0.998459
Gradients -3.25678e-05 -1.35713e-05

I have upload another picture. The background is opengl, whereas my software version on top. The floor is the best place to see what is happening.

Picture

Thanks
Yep, looks a bit of a mess and I don't think my first idea would show problems like that but it probably won't take much to fix. I'm not familiar with what you're doing with 'Plane' to find your gradients so I don't think I can help much with that.
I only use singles for all my interpolation and the only time I've experienced any problems with accuracy has been with very large skyboxes and even then it's just caused the textures to jump around a bit so just for z buffering a scene like that should be no problem.

This topic is closed to new replies.

Advertisement