Our GDW Game Vase - i2350
Well, the semester is coming to a close, and I thought I'd wrap up my blogs with an overview of our Game Development Workshop game - Vase. Of course, I have to relate this to our shaders course, so of course, I will be talking about the graphics techniques we used.
Vase is an isometric action game. It features a female heroine who has been cast in to a world where all the vases and pots have come to life to wreak havok upon the world. It is her job to smash these pots with her spells, and restore peace and order to the land.
We wanted the graphics in Vase to accompany the comedic nature of our game, and still be visually appealing. In Vase, we use per fragment lighting, cel shading + sobel edge detection to create toon shading, motion blur using the accumulation buffer, and baked ambient occlusion textures.
So here is what Vase looks like without any shaders. Keep in mind that some of the textures were incorrect at this point.
After we apply all of our graphics algorithms to the game, here is what it looks like.
Without the motion blur.
And now with the motion blur. Motion blur is triggered when the player collects a time stone powerup (the purple object in the picture).
As you can see, we wanted to make our game as colourful and vibrant as possible. We also wanted it to look like a hand drawn cartoon.
The first shading techniques we applied to the game were per fragment lighting and cel shading. We used the phong model for our lighting calculations. The diffuse, specular, and ambient values are calculated in the fragment shader, then added together to create the lighting intensity. From here, we take the intensity and limit it to certain values to create the cel shading. For example... if (intensity > 0.75){ intensity = 0.75; } We use 10 levels of intensity in our shading. On top of this, we threw in our sobel edge detection shader to get those black outlines.
Creating motion blur using the accumulation buffer was relatively easy. We have a boolean variable called accumBlur, which gets set to true if the player collects a powerup. After a few seconds, accumBlur is set to false and the motion blur stops. Here is what our display looks like. if(accumBlur){ static int i = 0; const int n = 2; if(i==0){glAccum(GL_LOAD, 1.0/n);} else{glAccum(GL_ACCUM, 1.0/n);} i++; if (i>=n){ i=0; glAccum(GL_RETURN, 1.0); App->Display(); } } else { App->Display(); } The 'n' variable represents how many frames are to be blurred. Since we didn't want the motion blur to make the game seemingly unplayable, we only blur two frames.
The ambient occlusion textures are baked on to all of our models. Here is an example of the gate model texture with no AO.
And here is an example of the gate, when AO has been baked on.
The ambient occlusion textures are meant to represent how light reflects internally on an object.
That's about it for this blog. Thanks for reading.















