Wednesday morning started with a session on how to use a free tool, AMD Perfstudio 2, to debug complicated graphics applications. Examples from Assassins Creed III and Far Cry 3 were used, as well as Valve’s port of Left 4 Dead 2 to show the tool’s OpenGL capabilities.
I’ve tried to use other versions of Perfstudio before, and I’ve struggled to get to grips with it. Hopefully when I find the time to take another look I’ll find it more user friendly, but it was definitely useful to see being used, and has some very cool features.
The final session of the morning was presented by Qualcom and turned out to be a bit of a sales pitch trying to get developers to target their snapdragon processors. It was still useful though, as there was some detailed information about developing using OpenGLES 3 features. They were using deferred shading techniques using multiple render targets and instancing geometry from within the shader. They finished with some pointers to the emulators that will let you do it now. Hopefully I’ll find the time to take a good look at this, although I doubt I’ll manage that until summer.
The physics continued into the afternoon with a session on continuous collisions, which presented a variety of methods for solving collisions (or approximately solving collisions to within a certain threshold) without allowing penetration. This was a pretty interesting session, but the highlight of the afternoon was a session from NVidia which presented methods for iteratively solving contacts between rigid bodies without any distracting jitter. Stacking objects is difficult, and the reason it is difficult is because there are a whole bunch of forces that all rely on each other being in balance together, at the same time. This is hard to do in a computer because you generally have to calculate impulses one at a time, without knowledge of other impulses that you haven’t calculated yet, but that will affect the impulse you’re calculating at the moment. Often, the result is jitter, which is when objects in a pile constants jump and jitter around rather than coming to rest in a stable pile. Two techniques we presented. One was better suited to single cores and one was capable of being parallelized on the GPU. They were both pretty complex so I’m not even going to try to explain them here, but the results were pretty impressive. The technique presented is being used in Hawken, which is a free to play first person mech fighting game. Check it out at https://www.playhawken.com//
Tuesday was mostly spent in sessions about game physics.
It began with a session that I wasn’t planning on going to, but because it was brought from the end of the day to the beginning of the day I ended up in it anyway. That turned out to be a good thing because it was much better than I thought it would be.
The topic was the speakers personal quest to create a physically based virtual version of the game Go. Go is an ancient and incredibly complex board game. The talk centred around creating a mathematical model for the playing pieces in the game (called stones) and then building a model that could perform physics on those stones.
Concepts we introduced one by one, linear motion, collision detection, rotation, frictione etc. The session was quite lightweight, but it was a good way to start the day. If you want to know more about this project go to http://www.gafferongames.com
Next came an indepth look at collision detection using the separating axis test. This is a test which detects collisions between convex solids by trying to determine if there is any axis which separates the two objects. That basically means that if you can fit a cigarette paper between them then they’re not colliding. A series of familiar concepts were covered, such as Minkowski sum and Minkowski difference, which can be used to two convex objects to a single convex object and a point.
If the point is inside the convex object then we’ve had a collision. The next question is where did that collision happen. We need to know where the collision happened because we want to push one object back out of the other object before we calculate an appropriate response.
So far so good, but next I learnt something new and pretty cool using something called a Gauss Map. The technique reduced the all the planes on the convex object to points on a sphere (in the direction of the normal vectors). Edges of the object are then represented as arcs on the sphere. The outcome is that collisions can only occur on edges where the arcs cross, which drastically reduces the number of canditates for collision points.
The last talk of the morning was an education talk about teaching a stand alone games class. It offered some nice ideas and practices that could be added to the Games Development Studies module.