Jump to content
  • Advertisement
Sign in to follow this  

OpenGL Software z-buffer problem

This topic is 3734 days old which is more than the 365 day threshold we allow for new replies. Please post a new topic.

If you intended to correct an error in the post then please contact us.

Recommended Posts

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;
	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

Share this post

Link to post
Share on other sites
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.

Share this post

Link to post
Share on other sites

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.



Share this post

Link to post
Share on other sites
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.

Share this post

Link to post
Share on other sites
Sign in to follow this  

  • Advertisement

Important Information

By using GameDev.net, you agree to our community Guidelines, Terms of Use, and Privacy Policy.

We are the game development community.

Whether you are an indie, hobbyist, AAA developer, or just trying to learn, GameDev.net is the place for you to learn, share, and connect with the games industry. Learn more About Us or sign up!

Sign me up!