Page 1 of 2
Brush model Z-Fighting Fix
Posted: Mon Dec 22, 2008 5:54 pm
by mh
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:
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).
Posted: Tue Dec 23, 2008 9:05 am
by metlslime
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)
Posted: Tue Dec 23, 2008 4:01 pm
by mh
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).
Posted: Thu Dec 25, 2008 3:43 pm
by revelator
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

Posted: Fri Oct 16, 2009 1:53 pm
by Team Xlink
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.
Posted: Fri Oct 16, 2009 3:20 pm
by mh
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).
Posted: Sat Dec 05, 2009 6:57 am
by ceriux
sorry to sound like a newb but i am one. so what exactly is Brush model Z-Fighting?
Posted: Sat Dec 05, 2009 7:48 am
by revelator
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.
Posted: Sat Dec 05, 2009 3:32 pm
by ceriux
hmm sounds like something worth trying to implement. on my list.
Posted: Sat Dec 05, 2009 9:16 pm
by Baker
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.
Posted: Sat Dec 05, 2009 9:53 pm
by ceriux
oh well then scratch one off then lol thanks for the tips. im just now getting into engine stuff so i have a lot to learn.
Posted: Sat Dec 05, 2009 10:12 pm
by Team Xlink
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.
Posted: Sun Dec 06, 2009 12:32 pm
by mh
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.
Posted: Sat Oct 23, 2010 2:26 am
by Mexicouger
Just thought I would throw in that this provided a small speed up as well.
Posted: Sat Oct 23, 2010 5:19 pm
by Downsider
Mexicouger wrote:Just thought I would throw in that this provided a small speed up as well.
I'm 100% sure you're wrong.