PDA

View Full Version : Halo from environment map



knackered
04-09-2002, 12:52 AM
I've just seen an xbox driving game, don't know the title, just saw it running in a shop.
Anyway, it did something that turned my head.
The wheel trims (alloys) of the car seemed to be using a simple environment map (cube map, I think). Nothing clever about that. But, as the wheel rotated, the environment map reflection changed as normal, but when the part of the environment map representing the sun was rendered on the trim, it gave off a halo, and a flare! I mean, the reflection produced a flare...this looked absolutely brilliant.
My question: what would be the most efficient way of producing this effect?
I can think of several ways, but they all seem like they'd be slow - is there something in the xbox hardware to make this efficient?
Another thing, it seemed to be using vertex shaders to produce a really nice heat-haze over the whole image.

Maj
04-09-2002, 02:23 AM
The game was Wreckless. Try gamespot.com for some more screenies.

AFAIK, all the halos and glows are done by rendering the scene to a texture/taking the framebuffer as a texture, subtracting a largish value to remove all but the bright stuff, then doing a few convolutions to blur everything into that star shape (_not_ a sprite, it's the result of non-uniform (term?) blurs), then adding it back to the framebuffer.

The great thing about this method is that it's very general (e.g. environment maps work perfectly) and reasonably constant time. The problem is that it eats major fillrate, and requires either a second scene render to texture or a stall while you copy and convolve the framebuffer.

The DOF/heat haze is covered on the NVidia site somewhere, although I don't know if they use the exact same method. I think they put a mip level in each texture unit and alpha blend between them, so any arbitrary blurring effects (haze) can be added on top as well as simple DOF.

Maj
04-09-2002, 02:27 AM
Screenies: 1 (http://gamespot.com/gamespot/filters/products/screens/0,11105,475755-99,00.html) , 2 (http://gamespot.com/gamespot/filters/products/screens/0,11105,475755-98,00.html) , 3 (http://gamespot.com/gamespot/filters/products/screens/0,11105,475755-100,00.html) .

knackered
04-09-2002, 05:29 AM
Good god, those screenshots look fantastic!
It certainly didn't appear to have any frame rate problems in the shop where I saw it.
Wow, I'm blown away!
Cheers for the info.

jwatte
04-09-2002, 12:35 PM
Xbox only needs to render 640x480 29.97 times per second, and has DDR memory as well as dual vertex processing pipes. You can get away with a lot under those circumstances :-)

knackered
04-09-2002, 11:31 PM
50fps or 60fps are the frequencies it has to aim for.

knackered
04-10-2002, 01:00 AM
Right, thanks to this forums search, I've found a link that explains how this flare effect is done (well, it explains how to do fast depth of field, but a neat halo effect is a side effect).
http://www.gamasutra.com/features/20010209/evans_01.htm

Funny, I can't remember depth of field in black & white.

Nutty
04-10-2002, 03:57 AM
I started writing one from scratch last night, almost working when the small hours arrived. needs some tweaking.

The only annoying part is getting a good amount of blur occuring at high speed.

Anyone got any cool tips n tricks for fast blurring on gfx hardware?

Nutty

kon
04-10-2002, 06:02 AM
Well, I've been thinking about something like enabling automatic mipmap generation (SGIS_generate_mipmap) and dynamically update the texture. Then using GL_ext_texture_lod_bias to choose a mipmap level. The higher the level the more blur the image will have. Has to be tested if that works and looks 'blurry'!

kon

Maj
04-10-2002, 06:41 AM
Originally posted by knackered:
50fps or 60fps are the frequencies it has to aim for.

Not true, e.g. Halo runs at 30fps. I'm pretty sure Wreckless runs at 30 (and occasionally lower) although I haven't got a copy around to confirm.

davepermen
04-10-2002, 08:35 AM
most consolegames run at 30fps (about 30fps depends on where you live (pal/ntsc))

and why this works?

because:
a tv screen is designed to show motion
a pc screen is designed to show static images sharp

Nutty
04-10-2002, 09:18 AM
I have to say 30hz on a console, doesn't look anywhere near as nice as 60. You can tell the difference a mile off. Especially when you're used to it running at 60.

It's not the difference between the screens, it's the fact that TV images capture blur when filming, CG generated images in PC's and consoles dont, thus when they're not updating fast enough, it looks jerky. And sharp non blurred 30hz is jerky.

Trust me, I'm working on a console game in NTSC, and seeing it go from 60hz to 30, it is a big difference in visual quality, and makes a noticable jarring on your eyes.

Nutty

jwatte
04-10-2002, 09:28 AM
knackered,

The Xbox doesn't even expose a 59.94 Hz 240 line per field mode for NTSC, nor a 50 Hz 290 line per field mode for PAL. Thus, all the games run at 29.94/25 Hz, and fill an entire progressive frame at 480 lines.
The fill rate is actually more or less the same for the two cases, but the transform rate is doubled in the interlaced case.

knackered
04-10-2002, 10:43 AM
30fps looks bad in my apps - maybe not as bad on a tv (probably because of the phosphor latency, mention by Nutty).
I don't know much about console/tv things, but why do dreamcast games give you the option of selecting between 50hz and 60hz when they boot up? They run super smooth in general.
I love my dreamcast... http://www.opengl.org/discussion_boards/ubb/wink.gif

knackered
04-10-2002, 10:45 AM
BTW, have any of you an opinion on those Wreckless screenshots?
Having seen it in motion, I really think it's worth the fill-rate hit.

Nutty
04-10-2002, 01:03 PM
The reason you get offered 50 or 60, is because most games are written for NTSC 1st, so all their physics are hard-coded to run at 60hz. This is because, alot of console games are designed to run at a fixed speed, so the code isn't always time adjusted. Plus not time adjusting all moving things, means less floating point maths involved.

Anyway, the game is written as it's supposed to be played at 60hz, then they do a PAL version, and slow it down to 50. But they dont re-write all the movement values, so the whole game effectively runs 16% slower. As alot of PAL TV's now support 60hz, they offer it as an option to play the game at the intended speed.

This causes quite a bit of anger with alot of ppl. In future all movement code will probably be time adjusted, as more and more console games are moving away from fixed update speed, and more like PC variable frame-rate.

P.S. About this post-process scene glare. I've knocked up a quick demo. It's not fancy, and it's not particularly efficient yet, but it kinda works.

There are 2 controls. O and P increase and decrease the intensity at which the upper-intensity-range image (The scene image, after a value has been subtracted from it) is rendered at, during the blur phase, and N and M increase or decrease the number of passes done in the blur loop.

Uses cubemapping, and glCopyTexSubImage2D, and only 1 texture unit, so it should run on a fair variety of things. To make the texture updating even simpler, I'm using a 512x512 window too.

Download it here; http://www.nutty.org/OpenGL/Test/glare.zip

I'll add some onscreen indicators of the twiddle values soon.

Nutty

P.S. When I get it nice, I'll upload the source code too.

[This message has been edited by Nutty (edited 04-10-2002).]

knackered
04-10-2002, 01:17 PM
That's a pretty nice little demo, Nutty.
One thing, how are you subtracting? Are you doing it in software? I say this because there seems to be a lot of stippling in there.
You could use the blend equation extension to subtract (blend subtract a screen sized quad), but this is only supported on geforce1 upwards...and probably a few other high end cards.

Nutty
04-10-2002, 01:22 PM
I am using the blend equation to subtract.

The stippling effect is a side effect of the blur.

Each blur pass, renders it addatively, in 4 positions.

X +and- Offset, Y
and
X, Y +and- Offset.

Offset was 2 pixels, so it creates a kind of star shape around each texel. Reducing offset to 1, removes this, but then requires twice as many blur passes.

There is an nvidia doc which shows how to sample all 8 texel neighbours, I'll try and stick that in, to see if it makes it better.

Nutty

J_Ramone
04-10-2002, 01:28 PM
hello... congratulations for all!!!

yakuza
04-10-2002, 04:33 PM
Hey Nutty, I got an error on your demo:
"Error getting blend eq func"

Radeon8500
I think I'm using the win2k 6043 drivers.

knackered
04-10-2002, 10:53 PM
The radeon8500 *must* have the blend subtract equation! Surely?

Nutty, sorry for misunderstanding the stippling effect - I understand now.

kieranatwork
04-10-2002, 11:26 PM
Surely it depends if quake3 uses blend subtract =)

thefirstbigd
04-11-2002, 05:13 AM
The latest 8500 drivers do have GL_EXT_blend_subtract in the extension string. But that might not be saying much.

NordFenris
04-11-2002, 06:31 AM
Me too, got that error message. However, it's on an year-old 8MB S3-card, so that's not so strange. However, I think it suggests that there's something else going on here...

Carmacksutra
04-11-2002, 06:48 AM
I havent tested it, but i think this could emulate blend_subtract:

InvertFB
draw data with Blend(1, 1)
InvertFB

and reverse_subtract:
draw inverted data with Blend(1, 1)
InvertFB

where InvertFB = draw white quad with Blend(1-DST_COLOR, 0)

Nutty
04-11-2002, 08:07 AM
The code was extremly quick n dirty, cut n pasted from another app. I'll make sure it's initializing that extension properly tonight.. Though I'm pretty sure it is.

Nutty

Lucky
04-11-2002, 08:57 AM
I can't run your demo Nutty.
It only draws blank window and then it freeze.

GF2
W2k&W98

Nutty
04-11-2002, 09:33 AM
What drivers are you using? It should run fine on GF2.

knackered
04-11-2002, 09:36 AM
Have you not got a support hotline, Nutty? http://www.opengl.org/discussion_boards/ubb/smile.gif

Lucky
04-11-2002, 09:42 AM
detonator XP/2000
28.32

all other GL apps run fine.

Nutty
04-11-2002, 10:01 AM
Hehe.. http://www.opengl.org/discussion_boards/ubb/smile.gif

Are you sure you extracted it okay.. sounds like it's not loading the model file or something.. and no I aint checking for that..

daveperman says it runs on his gf2mx, so you must be doing something wrong.

That'll be 50 pence please! http://www.opengl.org/discussion_boards/ubb/smile.gif

Nutty

P.S. Wait for the next version it will have better error checking in.

[This message has been edited by Nutty (edited 04-11-2002).]

knackered
04-11-2002, 10:57 AM
Lucky, just write yourself a little test app that shows the effect - it's not that complicated - read the document I linked to.
I've just finished writing one myself, similar to Nutty's, but I've no web space to upload it to at the moment - sorry.
Nutty's a busy person... give him a break http://www.opengl.org/discussion_boards/ubb/wink.gif

I've tried his (and my) app on 2 computers so far:-
Windows2000 + Dual PIII 733mhz with geforce2gts
WindowsXP + Athlon1.3ghz + geforce3ti500

It works fine on both systems.

thefirstbigd
04-11-2002, 11:24 AM
For anyone messing around with this, here's an idea:

Just do this effect on specular and ambient terms of your shading model, and then average the effect over previous frames.

Lucky
04-11-2002, 11:27 AM
I'll try it.

knackered
04-11-2002, 11:33 AM
If you average it over previous frames you'll get blur when the camera moves - I don't like that effect, it's pretty unnatural, unless you're watching a drug sequence in Easy Rider, or something. http://www.opengl.org/discussion_boards/ubb/smile.gif

I like the idea of just rendering the specular term, though - but that adds a pass to the render.

thefirstbigd
04-11-2002, 11:48 AM
I saw on an TV advert for Project Gotham racing that the cars headlights left a halo-trail, as they flew past. So to avoid the stoned effect you'd turn that effect on/off per surface.

Or you could just put a slow LCD screen as a system requirement for your game...

davepermen
04-11-2002, 12:07 PM
does not need additional pass for specular only.
so how?

calculate your color. add your specular. if it is bigger than one, take the part bigger than one and store it in the screenalpha. (yes its not rgb anymore)

use this rgba-texture for the blurring. the alpha tells how visible the stuff is, and the color wich stuff. that way you should get it working quite easy.

davepermen
04-11-2002, 12:44 PM
nutty. its permEn, not permAn..
at least you should know my name (but i learned that you don't today http://www.opengl.org/discussion_boards/ubb/wink.gif)

thefirstbigd
04-11-2002, 12:50 PM
Has anyone got/found any demos for the the GDC presentation on light scattering in realtime? ( http://www.ati.com/developer/gdc/GDC02_HoffmanPreetham.pdf )

Nutty
04-11-2002, 11:28 PM
Soz dave,

Yeah about the previous frame thing. I was gonna say that yesterday, cos I thought of it after I did that quick demo. I thought it would be pretty cool to have a glow trail on fast moving lights.

About the "Just do it on specular terms". This is a fullscene process, it's not possible to distinguish the difference beteen whats specular, and whats just bright. Although I am adding in controls to adjust the brightness to recieve glow tolerance. Crancking this right up, would reduce the glow to only very bright stuff.

Currently that demo had no-lighting in what-so-ever, so thats why it did it all over the shop. Adding some diffuse and specular in would make it alot nicer.

I wish dave would hurry up and tell us how to do brightness greater than 1, instead of just telling me to use it all the time. Please discuss how you do this in this thread. Ta.

Nutty

P.S. B4 you flame me, I just realised you can do this on just specular and ambient only. Might actually work out faster, with no textures n stuff.

But, the game in question did it on bright parts of environment maps, if I understood correctly, and I was trying to simulate that.

There are many different things you could tweak, and change, and fiddle with, and get a whole host of different effects.

[This message has been edited by Nutty (edited 04-12-2002).]

davepermen
04-12-2002, 12:26 AM
nutty.. if you would have asked yesterday i would have explained it, just dont run away http://www.opengl.org/discussion_boards/ubb/smile.gif

well its easy.. simply calculate your color in the texenv or rc's or fragmentshaders, subtract one, calculate the brightness of this (a dp3) and draw this into the alpha-part of the screen.
the subtract one can be done with the help of signed_add.. at least the registercombiners wich have range -1,1 work. and the fragmentshaders with range from -8,8 are no problem eighter..

then use this alphavalue for knowing how visible the glow there is and then do the fast blurring with help of the link i sent to you ( http://www.ati.com/developer/sdk/RadeonSDK/Html/Samples/Direct3D/RadeonLightGlare.html ) wich yields to much faster big blurring (wreckless blurres quite big but not that bright except bright highlights..)

or you simply draw into the alphabuffer 1 if it this pixel should glow and 0 else (per texel on a map or per object or whatever..) as long as you generate the envmap yourself in realtime the alpha will be there, too.. as on the reflected water..

and yes its a postrendering effect that logical

[This message has been edited by davepermen (edited 04-15-2002).]

[This message has been edited by davepermen (edited 04-15-2002).]

[This message has been edited by davepermen (edited 04-15-2002).]

Nutty
04-12-2002, 03:52 AM
I didn't run anywhere, I had things to do, other than argue over M$'s inconsistent windows API.

Anyway, thats enuff of that. I'll post a new demo Sunday, which will maybe have that feature in, as well as a host of different blur tricks, and UI to all the values.

Nutty

knackered
04-12-2002, 04:33 AM
Arguing is my job - you don't want trouble with the unions http://www.opengl.org/discussion_boards/ubb/smile.gif

knackered
04-14-2002, 10:53 PM
Sunday is a distant memory now, Nutty....where's your program! http://www.opengl.org/discussion_boards/ubb/smile.gif

Nutty
04-14-2002, 11:18 PM
hehe.. sorry I was busy watching the grand-prix, and washing my car, and cleaning the kitchen. It will be sometime this week. http://www.opengl.org/discussion_boards/ubb/smile.gif

Nutty

knackered
04-14-2002, 11:25 PM
A traditional Sunday, as god intended. http://www.opengl.org/discussion_boards/ubb/smile.gif

Nutty
04-17-2002, 01:56 PM
Finally got some nice big and fast blur running now. Take a look at these OTT screenies..
http://www.nutty.org/ScreenShots/cool1.jpg http://www.nutty.org/ScreenShots/cool2.jpg http://www.nutty.org/ScreenShots/cool3.jpg http://www.nutty.org/ScreenShots/cool4.jpg http://www.nutty.org/ScreenShots/cool5.jpg

Over 100fps, and I aint started optimizing yet.. http://www.opengl.org/discussion_boards/ubb/smile.gif

Next I'm gonna add lighting, and try Daves greater than 1.0 intensity light glare.

Nutty

knackered
04-17-2002, 10:49 PM
Lookin' good Nutty!
Any reason why you're not posting an exe ?
Don't worry about compatibility problems, just post it! http://www.opengl.org/discussion_boards/ubb/wink.gif

Nutty
04-17-2002, 11:20 PM
All in good time.. http://www.opengl.org/discussion_boards/ubb/smile.gif Probably late friday night, so I can add some more features.

Eric
04-18-2002, 02:47 AM
Originally posted by Nutty:
Probably late friday night

How can you do anything after a looooooooong pub session ??? http://www.opengl.org/discussion_boards/ubb/wink.gif

Eric

davepermen
04-18-2002, 09:50 PM
just have to say it now looks quite cool, but its not yet finished.. hope he get it this evening

thefirstbigd
04-19-2002, 11:41 PM
I find some of my best coding stints are when i'm drunk...

Nutty
04-20-2002, 06:54 AM
Demo on my site, if anyones interested.. I'd appreciate some feedback on frame-rates on various hardware. Be sure to let me know how many mip-level's you're using at the time.

Ta,
Nutty

P.S. There's still alot of optimizations to be done in there too.

knackered
04-20-2002, 07:27 AM
Wow! Wow! Wow!
That's it! That's the wreckless effect!
Fantastic looking demo, Nutty.
Post that as an image of the day on flipcode...

Nutty
04-20-2002, 07:29 AM
You can do it for me if you want, cos I'm not a member there or anything.. http://www.opengl.org/discussion_boards/ubb/smile.gif

Glad you like it..

Nutty

knackered
04-20-2002, 08:15 AM
Err, no - it'd be best if you did it http://www.opengl.org/discussion_boards/ubb/smile.gif Don't like the idea of sharing credit for something I didn't do.

Forgot to give you some stats:-

My set up: athlon 1.2ghz, geforce3 ti500

default settings: 92fps
mipmap level 6: 102fps

Once again, fine demo. Good to see something dramatic for a change.

davepermen
04-20-2002, 09:19 AM
i just want to state that i'm currently playing wreckless, and it has even more funny features.. you can enable filters wich affect the image afterwards, to get all those nice effects like night-vision, or edge-filters etc.. there are some great looking ones, looks like movies.. its damn cool game somehow..

great job with the demo btw.. so far so cool.. let it be more than just a spaceship now (skybox with glowing sun etc) and then put it on flipcode, yes..

knackered
04-20-2002, 09:41 AM
Nutty, it might be a nice gesture if you give Alex Evans a credit in your source code, or didn't you read that article I linked to?

Nutty
04-20-2002, 12:44 PM
I didn't read it. That link just prompted a username and password for me. The only help was Dave, and the technique about using mip-levels in blurs from ATI developer page, that Dave found. I didn't bother looking at the source tho. Credits to Dave and ATI are in the source..

I have some wondering about using destination alpha, and alpha-test to help cut down fill-rate.. I'm gonna post another version soon with more complex features, more optimizations, and some different blur styles.

knackered
04-20-2002, 01:42 PM
Ok. I haven't read the ATI doc. I can only assume that someone at ATI read it, because that is exactly what the gamasutra article suggests doing, dated feb 2001 - and it's what I have done. I'm not getting all uptight about IP - I'm happy you've given ATI credit.
I think I'm a little drunk - watching Peter Kay on telly... http://www.opengl.org/discussion_boards/ubb/smile.gif

Nutty
04-20-2002, 01:52 PM
Peter Kay rools.. His holiday sketches are top..

"Whats weather like there!?"
...
"It's spittin'!" http://www.opengl.org/discussion_boards/ubb/smile.gif

knackered
04-21-2002, 02:02 AM
He does indeed. Why do mums buy crap pop? http://www.opengl.org/discussion_boards/ubb/smile.gif

jabe
04-21-2002, 10:13 PM
very nice piece of code.

setup:
winXP, duron 800, geforce2mx

performance:
mipmaplevel <= 4, up to 42 fps
mipmaplevel > 4, mostly 28 fps

regards,
jan

lukasz
04-23-2002, 06:22 AM
cool demo, nice effect.

WinXP, Asus 28.80 drivers,
gf2GTS, Athlon 1.2Ghz

Mip Levels 8 = ~50fps
Mip Levels 4 = ~70fps

Lucky
04-24-2002, 04:25 AM
It's really cool.

GF2MX400, celeron 366, W98, detonator 28.32

fps: MIN MAX
mip levels<=5 50 70
mip levels>5 40 50

Lucky