Shadow Mapping, part 2

Removing artifacts

Removing artifacts near the light is simply done by adding a bias to the depth test, it is good enough in our case

capture_2014-12-14_15-13-53_0960_Alien_Blitz_

I’ve also added back unrealistic shadows on wall: walls on the right/left or down/top have an automatic different shadow applied, it makes gaps easier to see (you can see the small holes on the top-right of the image now, they were previously invisible).

It could be done using global illumination, but this method is a lot quicker (just testing the normal of a surface) and works nicely in Alien Blitz.

 

“Our case”

I will now make some assumptions, in order to get a good visual aspect over rendering speed ratio. It is very specific to Alien Blitz:

  • Most lights have a small range, except sun lights that will probably have a specific code
  • Bullets should not have a realistic shadow, the old one is best as it allows player to easily guess the height of a missile (I’ve tested both, unrealistic shadow is really better for gameplay)
  • View is quite far away, no need for high quality shadows (a FPS view would require such shadows)
  • There can be lots of lights on screen, so they should be computed quickly

These points explain some choices I will make from now on, if at some point I want to develop a first person view game I will have to change lots of code.

 

Testing different shadow map sizes

64px:

screenshot38

capture_2014-12-14_15-16-24_0336_Alien_Blitz_

 

256px:

screenshot39

capture_2014-12-14_15-16-41_0168_Alien_Blitz_

 

1024px:

screenshot40

capture_2014-12-14_15-17-06_0711_Alien_Blitz_

 

64px is obviously too small, 256px should be enough for most lights, and 1024px for high range lights (sun)

There are some artifacts above walls, I will have to correct them with PCF but maybe just as an option (3 quality options for shadows : low without PCF & 256px maps, medium with PCF & 512px maps, high with PCF & 1024px maps, or something like that)

 

Real level test

I’ve changed my code a bit so that light used for shadow mapping is the closest to the player, that allows me to quickly run some tests on actual levels.

capture_2014-12-14_15-31-34_0441_Alien_Blitz_

It really feels good, currently shadows are very big, but when all lights will use shadow mapping it should feel better I think, otherwise I will have to make some changes on lights (higher and looking at the ground)

 

More complex test case

For next modifications I will need a more complex test case, with more lights, colors and such. Here it is (it also let me test that the old code was still working)

capture_2014-12-14_15-53-51_0733_Alien_Blitz_

I should have used this king of effect (different light colors in the same room) in the game, it looks nice :)

 

Point lights / Omni-directional lights

Omni-directional lights require to use a cubemap, basically the scene is rendered 6 times : left/right/up/down/bottom/top

Of course in Alien Blitz top rendering is useless

The idea is just to render the scene 6 times, changing camera looking direction and viewport position/size each time.

Here is the resulting map

screenshot53

I will assume a light does not cast a shadow on itself, it will make things easier (hence the full black image in the bottom-right, the top-right is supposed to store the top view map, but it is unused here)

Time to render this new map now:

capture_2014-12-14_18-45-57_0151_Alien_Blitz_

There are some artifacts on the edges of the 5 generated maps (it can be see on the left/down diagonal), other than that it seem quite fine.

 

What’s next?

I am now considering managing multiple lights, but I’m afraid I will come on some difficulties:

  • Depending on the video card there can be some huge limitations (221 max uniforms vectors, 16 textures, on one of my video cards)
  • I still get 60fps, but I think it is already beginning to be heavy on the gpu (my laptop is increasing fan speed, that’s a good indicator)

Most examples on the Internet are very simple: directional light, one light only,… so I will have to find some better sources on how to manage multiple lights and do lot of tests.

And of course I need to handle colors now.

Comments are closed.