Brush model Z-Fighting Fix
Moderator: InsideQC Admins
19 posts
• Page 1 of 2 • 1, 2
Brush model Z-Fighting Fix
You hate it, I hate it, even the dogs in the street organized a protest march about it last week.
So let's get rid of it.
Step 1
Find the #define for DIST_EPSILON in world.c and move it to quakedef.h
Step 2
Open gl_rsurf.c, find R_DrawBrushModel, and add these lines before the call to R_RotateForEntity:
Step 3
Same file, same function, add these lines after the call to R_RotateForEntity:
Result
No more brush model Z-fighting.
OK, it's the cheapest, nastiest hack in the universe, but it works. You do get a tiny glitch in that there's a very very small see-through crack around some edges of some doors, but if that bothers you, you can make your own define for this purpose (or even cvar-ize it) (I don't recommend messing with the value of DIST_EPSILON).
So let's get rid of it.
Step 1
Find the #define for DIST_EPSILON in world.c and move it to quakedef.h
Step 2
Open gl_rsurf.c, find R_DrawBrushModel, and add these lines before the call to R_RotateForEntity:
- Code: Select all
// hack the origin to prevent bmodel z-fighting
e->origin[0] -= DIST_EPSILON;
e->origin[1] -= DIST_EPSILON;
e->origin[2] -= DIST_EPSILON;
Step 3
Same file, same function, add these lines after the call to R_RotateForEntity:
- Code: Select all
// un-hack the origin
e->origin[0] += DIST_EPSILON;
e->origin[1] += DIST_EPSILON;
e->origin[2] += DIST_EPSILON;
Result
No more brush model Z-fighting.
OK, it's the cheapest, nastiest hack in the universe, but it works. You do get a tiny glitch in that there's a very very small see-through crack around some edges of some doors, but if that bothers you, you can make your own define for this purpose (or even cvar-ize it) (I don't recommend messing with the value of DIST_EPSILON).
We had the power, we had the space, we had a sense of time and place
We knew the words, we knew the score, we knew what we were fighting for
We knew the words, we knew the score, we knew what we were fighting for
-

mh - Posts: 2292
- Joined: Sat Jan 12, 2008 1:38 am
Corrects if I'm wrong, but this code will arbitrarily (but consistently) show either the bmodel face or the world face, depending on facing angle, right? And there's a certain weird angle that will still have z-fighting?
(Not knocking it, seems like a worthwhile hack)
(Not knocking it, seems like a worthwhile hack)
- metlslime
- Posts: 316
- Joined: Tue Feb 05, 2008 11:03 pm
metlslime wrote:Corrects if I'm wrong, but this code will arbitrarily (but consistently) show either the bmodel face or the world face, depending on facing angle, right? And there's a certain weird angle that will still have z-fighting?
(Not knocking it, seems like a worthwhile hack)
No, you're perfectly right. I consider it an acceptable trade-off, as the Z-fighting normally occurs on horizontal planes viewed at oblique angles, and is more likely to be observed looking forward or down than looking up, so subtracting a tiny fraction from the z origin (going up in Quake) will resolve it in 99% of practical cases, with 99% of the remaining being at least consistent (no fighting).
We had the power, we had the space, we had a sense of time and place
We knew the words, we knew the score, we knew what we were fighting for
We knew the words, we knew the score, we knew what we were fighting for
-

mh - Posts: 2292
- Joined: Sat Jan 12, 2008 1:38 am
what the F
oh so thats what that codebit was for very cool
some where wondering how you fixed z fighting in realm me to btw
back from christmas now and going to release some tutorials about how to add compressed pk3 support to quake and a few other goodies comming
back from christmas now and going to release some tutorials about how to add compressed pk3 support to quake and a few other goodies comming
-

revelator - Posts: 2567
- Joined: Thu Jan 24, 2008 12:04 pm
- Location: inside tha debugger
I have implemented this fix and have done extensive testing.
I still noticed a small amount of Z-Fighting.
It does reduce it drastically but it is just enough to still be a small annoyance.
I still noticed a small amount of Z-Fighting.
It does reduce it drastically but it is just enough to still be a small annoyance.
- Team Xlink
- Posts: 368
- Joined: Thu Jun 25, 2009 4:45 am
- Location: Michigan
It's never going to be perfect owing to the non-linear nature of the Z buffer (the same applies to a polygon offset solution).
We had the power, we had the space, we had a sense of time and place
We knew the words, we knew the score, we knew what we were fighting for
We knew the words, we knew the score, we knew what we were fighting for
-

mh - Posts: 2292
- Joined: Sat Jan 12, 2008 1:38 am
http://en.wikipedia.org/wiki/Z-fighting
in basic its if two surfaces hold the same data in the Z-buffer the image will look like its broken up so to alleviate it you offset part of the data.
or you use a higher resolution Z-buffer.
in basic its if two surfaces hold the same data in the Z-buffer the image will look like its broken up so to alleviate it you offset part of the data.
or you use a higher resolution Z-buffer.
-

revelator - Posts: 2567
- Joined: Thu Jan 24, 2008 12:04 pm
- Location: inside tha debugger
ceriux wrote:hmm sounds like something worth trying to implement. on my list.
For what it is worth, the Z-fighting thing is largely an original id1 maps problem that affects e1m1 near quad, several exit areas with doors and a couple of other places.
Any engine with the idea of running all custom made maps, doesn't really need this. Because no one would make maps like that today.
For instance, I can't recall seeing Z-fighting in any quality custom map I have ever played. Or even a bad quality one, actually.
I'm just saying that any engine with the idea of it really being made more for a specific total conversion, the priority level of this kind of thing would be near rock bottom.
-

Baker - Posts: 3666
- Joined: Tue Mar 14, 2006 5:15 am
Baker wrote:ceriux wrote:hmm sounds like something worth trying to implement. on my list.
For what it is worth, the Z-fighting thing is largely an original id1 maps problem that affects e1m1 near quad, several exit areas with doors and a couple of other places.
Any engine with the idea of running all custom made maps, doesn't really need this. Because no one would make maps like that today.
For instance, I can't recall seeing Z-fighting in any quality custom map I have ever played. Or even a bad quality one, actually.
I'm just saying that any engine with the idea of it really being made more for a specific total conversion, the priority level of this kind of thing would be near rock bottom.
Well with every quake total conversion that you can map for someone is bound to make a badly made map.
I think this is good but mainly because I like keeping backwards compatibility with standared Quake maps via engine side.
- Team Xlink
- Posts: 368
- Joined: Thu Jun 25, 2009 4:45 am
- Location: Michigan
The real fix of course is to just rebuild and rerelease the maps. Opportunity could be taken to fix a few other minor bugs in them, such as misaligned textures/etc.
We had the power, we had the space, we had a sense of time and place
We knew the words, we knew the score, we knew what we were fighting for
We knew the words, we knew the score, we knew what we were fighting for
-

mh - Posts: 2292
- Joined: Sat Jan 12, 2008 1:38 am
19 posts
• Page 1 of 2 • 1, 2
Return to Programming Tutorials
Who is online
Users browsing this forum: No registered users and 1 guest

