Tuesday, October 09, 2007

Shadows and next step...

Today, after reading Martin Korth's recently released (he hadn't updated it since ages ago) explanation on how DS hardware shadow volumes work, I attempted to implement them, as it was easier than I thought: it's not like the stencil shadows implementations that I've seen on PC, were the stencil is used to block lighting, and usually a shadow volume has to be computed per light. On the DS, it's a two step process: first, a mask step, which basically creates a mask to know where the next step should be applied, and a second step, that it's simply drawing a certain (usually black or dark) volume were the mask lets us. Light computation/s is NOT used at all :P

For example, imagine a cylinder intersecting the floor, the first step would create a mask that would resemble a circle on the floor (in fact it doesn't work exactly like that, but for the explanation sake...), and the second would paint a dark colour on that circle (and nowhere else). Why use a cylinder, and not a circle directly? Because we can't be sure of the topology/shape of the floor, neither if it'll be a floor, or animated: using this approach, we can shadow whatever is inside our cylinder, without the need of knowing the rest of the object/s in the scene.

So here's the result, and that fixes one of the last "big" bugs on Mario 64 DS. In the process I also fixed and important blending/transparency bug, which narrows even more the list of graphic bugs: only small ones left, the "waves" background on the save selection screen don't look exactly as on the DS, probably due to the way lights or normals are treated right now and the writing on Daisy's letter don't fade correctly (2D core related). Anyway, here's two shots of Mario 64 DS, and one of Tak - The Great JuJu Challenge:




About Tak - The Great JuJu Challenge, it's my next target to debug, as it show geometry, but it's completely wrong/uninitialized. Were it should show an animated mesh, it just show a static blob of what seems random data. I've a few ideas about what could cause that, but first I'd like to spend some trying them.

Have fun :)

4 comments:

Federico said...

Nice progress :), now that zelda is out in english, perhaps you could check that out. It seems to be the most intensive 3d game yet, looks great, lots of nice effects, and speed hungry.
Gluck with tak.

shash said...

federico: Yep, but I should implement the 4mbit save type, and it's one part of desmume that I find terribly boring :P

belgther said...

Also, great work!
But the bad thing is that you don't share your work somehow, or publish it. Maybe just because they are small hacks that should be removed... But how about adding a special hack menu to turn on/off those hacks for specific games? Because as far as I follow the repository, desmume doesn't make any steps, so once it was the best DS emulator, not it is the worst and least compatible. If those hacks/improvements would be closable manually, then everyone would be happy.

shash said...

belgther: I've correctly implemented the only stuff that I considered hacky (the gfx FIFO irq), so there's nothing in my build that can be considered a hack now :)