# OpenGL Software z-buffer problem

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

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

##### 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 on other sites
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
Z values 0.998719 0.998683 0.998312
Z values 0.998683 0.998459 0.998312
Z values 0.998683 0.998812 0.998459

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

##### 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.

• ### Similar Content

• By xhcao
Does sync be needed to read texture content after access texture image in compute shader?
My simple code is as below,
glUseProgram(program.get());
glBindImageTexture(0, texture[0], 0, GL_FALSE, 3, GL_READ_ONLY, GL_R32UI);
glBindImageTexture(1, texture[1], 0, GL_FALSE, 4, GL_WRITE_ONLY, GL_R32UI);
glDispatchCompute(1, 1, 1);
// Does sync be needed here?
glUseProgram(0);
GL_TEXTURE_CUBE_MAP_POSITIVE_X + face, texture[1], 0);
glReadPixels(0, 0, kWidth, kHeight, GL_RED_INTEGER, GL_UNSIGNED_INT, outputValues);

Compute shader is very simple, imageLoad content from texture[0], and imageStore content to texture[1]. Does need to sync after dispatchCompute?

• My question: is it possible to transform multiple angular velocities so that they can be reinserted as one? My research is below:

• I have this code below in both my vertex and fragment shader, however when I request glGetUniformLocation("Lights[0].diffuse") or "Lights[0].attenuation", it returns -1. It will only give me a valid uniform location if I actually use the diffuse/attenuation variables in the VERTEX shader. Because I use position in the vertex shader, it always returns a valid uniform location. I've read that I can share uniforms across both vertex and fragment, but I'm confused what this is even compiling to if this is the case.

#define NUM_LIGHTS 2
struct Light
{
vec3 position;
vec3 diffuse;
float attenuation;
};
uniform Light Lights[NUM_LIGHTS];

• By pr033r
Hello,
I have a Bachelor project on topic "Implenet 3D Boid's algorithm in OpenGL". All OpenGL issues works fine for me, all rendering etc. But when I started implement the boid's algorithm it was getting worse and worse. I read article (http://natureofcode.com/book/chapter-6-autonomous-agents/) inspirate from another code (here: https://github.com/jyanar/Boids/tree/master/src) but it still doesn't work like in tutorials and videos. For example the main problem: when I apply Cohesion (one of three main laws of boids) it makes some "cycling knot". Second, when some flock touch to another it scary change the coordination or respawn in origin (x: 0, y:0. z:0). Just some streng things.
I followed many tutorials, change a try everything but it isn't so smooth, without lags like in another videos. I really need your help.
My code (optimalizing branch): https://github.com/pr033r/BachelorProject/tree/Optimalizing
Exe file (if you want to look) and models folder (for those who will download the sources):
http://leteckaposta.cz/367190436
Thanks for any help...

• By Andrija
I am currently trying to implement shadow mapping into my project , but although i can render my depth map to the screen and it looks okay , when i sample it with shadowCoords there is no shadow.
Here is my light space matrix calculation
mat4x4 lightViewMatrix; vec3 sun_pos = {SUN_OFFSET * the_sun->direction[0], SUN_OFFSET * the_sun->direction[1], SUN_OFFSET * the_sun->direction[2]}; mat4x4_look_at(lightViewMatrix,sun_pos,player->pos,up); mat4x4_mul(lightSpaceMatrix,lightProjMatrix,lightViewMatrix); I will tweak the values for the size and frustum of the shadow map, but for now i just want to draw shadows around the player position
the_sun->direction is a normalized vector so i multiply it by a constant to get the position.
player->pos is the camera position in world space
the light projection matrix is calculated like this:
uniform mat4 light_space_matrix; void main() { gl_Position = light_space_matrix * transfMatrix * vec4(position, 1.0f); } Shadow fragment shader:
out float fragDepth; void main() { fragDepth = gl_FragCoord.z; } I am using deferred rendering so i have all my world positions in the g_positions buffer