Forum

Brush model Z-Fighting Fix

Post tutorials on how to do certain tasks within game or engine code here.

Moderator: InsideQC Admins

Brush model Z-Fighting Fix

Postby mh » Mon Dec 22, 2008 5:54 pm

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

Postby metlslime » Tue Dec 23, 2008 9:05 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)
metlslime
 
Posts: 316
Joined: Tue Feb 05, 2008 11:03 pm

Postby mh » Tue Dec 23, 2008 4:01 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
User avatar
mh
 
Posts: 2292
Joined: Sat Jan 12, 2008 1:38 am

Postby revelator » Thu Dec 25, 2008 3:43 pm

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:
User avatar
revelator
 
Posts: 2567
Joined: Thu Jan 24, 2008 12:04 pm
Location: inside tha debugger

Postby Team Xlink » Fri Oct 16, 2009 1:53 pm

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

Postby mh » Fri Oct 16, 2009 3:20 pm

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

Postby ceriux » Sat Dec 05, 2009 6:57 am

sorry to sound like a newb but i am one. so what exactly is Brush model Z-Fighting?
User avatar
ceriux
 
Posts: 2223
Joined: Sat Sep 06, 2008 3:30 pm
Location: Indiana, USA

Postby revelator » Sat Dec 05, 2009 7:48 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.
User avatar
revelator
 
Posts: 2567
Joined: Thu Jan 24, 2008 12:04 pm
Location: inside tha debugger

Postby ceriux » Sat Dec 05, 2009 3:32 pm

hmm sounds like something worth trying to implement. on my list.
User avatar
ceriux
 
Posts: 2223
Joined: Sat Sep 06, 2008 3:30 pm
Location: Indiana, USA

Postby Baker » Sat Dec 05, 2009 9:16 pm

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.
User avatar
Baker
 
Posts: 3666
Joined: Tue Mar 14, 2006 5:15 am

Postby ceriux » Sat Dec 05, 2009 9:53 pm

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

Postby Team Xlink » Sat Dec 05, 2009 10:12 pm

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

Postby mh » Sun Dec 06, 2009 12:32 pm

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

Postby Mexicouger » Sat Oct 23, 2010 2:26 am

Just thought I would throw in that this provided a small speed up as well.
User avatar
Mexicouger
 
Posts: 514
Joined: Sat May 01, 2010 10:12 pm

Postby Downsider » Sat Oct 23, 2010 5:19 pm

Mexicouger wrote:Just thought I would throw in that this provided a small speed up as well.


I'm 100% sure you're wrong.
User avatar
Downsider
 
Posts: 621
Joined: Tue Sep 16, 2008 1:35 am

Next

Return to Programming Tutorials

Who is online

Users browsing this forum: No registered users and 1 guest