Brush model Z-Fighting Fix

Post tutorials on how to do certain tasks within game or engine code here.
mh
Posts: 2292
Joined: Sat Jan 12, 2008 1:38 am

Brush model Z-Fighting Fix

Post 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. :D

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
metlslime
Posts: 316
Joined: Tue Feb 05, 2008 11:03 pm

Post 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)
mh
Posts: 2292
Joined: Sat Jan 12, 2008 1:38 am

Post 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).
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
revelator
Posts: 2621
Joined: Thu Jan 24, 2008 12:04 pm
Location: inside tha debugger

Post by revelator »

what the F :shock: oh so thats what that codebit was for very cool :D some where wondering how you fixed z fighting in realm me to btw :lol:

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 :wink:
Team Xlink
Posts: 368
Joined: Thu Jun 25, 2009 4:45 am
Location: Michigan

Post 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.
mh
Posts: 2292
Joined: Sat Jan 12, 2008 1:38 am

Post 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).
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
ceriux
Posts: 2230
Joined: Sat Sep 06, 2008 3:30 pm
Location: Indiana, USA

Post by ceriux »

sorry to sound like a newb but i am one. so what exactly is Brush model Z-Fighting?
revelator
Posts: 2621
Joined: Thu Jan 24, 2008 12:04 pm
Location: inside tha debugger

Post 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.
ceriux
Posts: 2230
Joined: Sat Sep 06, 2008 3:30 pm
Location: Indiana, USA

Post by ceriux »

hmm sounds like something worth trying to implement. on my list.
Baker
Posts: 3666
Joined: Tue Mar 14, 2006 5:15 am

Post 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.
ceriux
Posts: 2230
Joined: Sat Sep 06, 2008 3:30 pm
Location: Indiana, USA

Post 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.
Team Xlink
Posts: 368
Joined: Thu Jun 25, 2009 4:45 am
Location: Michigan

Post 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.
mh
Posts: 2292
Joined: Sat Jan 12, 2008 1:38 am

Post 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.
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
Mexicouger
Posts: 514
Joined: Sat May 01, 2010 10:12 pm
Contact:

Post by Mexicouger »

Just thought I would throw in that this provided a small speed up as well.
Downsider
Posts: 621
Joined: Tue Sep 16, 2008 1:35 am

Post 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.
Post Reply