Friday, March 24, 2006

GDC - Friday

Friday has been my most busy day at GDC. I started the day off by attending a session put on by two guys from Epic on Modeling next-gen characters. They detailed the process of creating a character starting at the concept stage all the way through to the completed in-game model. There were tons of details and they went through it all really fast. Here are some of the highlights: They spent 6 weeks concepting their main character and another 4 weeks modeling him. They break their characters up into parts and create a library of max files with lots of parts to they can reuse them. When exporting a model to Zbrush, it's important to use quads, not triangles. They go back and forth between Zbrush and Max when working on the detailed model. Once their models are detailed in Zbrush, they have to break them appart and run them through Polygon Cruncher to reduce the poly count so Max doesn't crash when they import. They use obj format for going back and forth between Zbrush and Max. Their characters typically use 2 2048 textures. They use Max's render-to-texture to create diffuse maps, height maps, ambient occlusion maps, and normal maps for the low res mesh. The most important map is the normal map. That's where all the detail is. The diffuse map is mostly just flat color. Overall, this session was very informative.

Next I attended a session by Paul Steed on Defining the Next-Gen Character. It was basically just a laundry list of all the stuff a character has to have to be considered "next-gen."

After that I got into the Epic booth and got to see a live demo of Gears of War and Unreal 2007. It was a very cool presentation. I was impressed that they're able to use partial rag doll and even full body rag doll and have the character recover and return to what it was doing before. The also demoed FaceFX. It's a facial animation add-on for the engine that automatically parses wav files and extracts phonemes. Then it creates the lip synch for your character and you can go in and add detail and tweek the animation as needed. The cool part was the ability to control the intensity of normal maps with the sliders in addition to the morph targets so wrinkles in the face to be created. I was happy to see that they've solved the issue of billboard particles clipping into things. That's been a pet pieve of mine for awhile.

Next I attended a session by Kevin Bjorke about creative uses for textures in the shader pipeline. He talked about mip maps and what you should and shouldn't do with them. He talked about a shader that he's written that helps you know what texture res to use on your model and find the areas where the UVs are stretching. I'm definatly going to start using that! He showed a tool that he wrote for Photoshop that creates mip maps so you can edit them. He also showed some reall interesting BRDF style shaders that allowed you to paint on the BRDF input textures until you got the results you wanted. He ended his talk with a toon shader that was pretty cool.

To end the day, I attended a talk by Neil Hazzard from Autodesk on using real-time shaders in Max. He explained a lot of things about Max's shader support that I didn't know about. A lot of the problems I've been having lately with my shaders can be solved with the features he discussed. I'm going to be studying his slides for a long time. Neil gave me some time during his presentation for me to show off some of the shaders that I've written. That was really fun and people seemed to like my work. Several artists came up to talk to me after the demo about getting together to colaborate on shader writing. That is probably the most valuable thing for me about the whole trip - meeting some other artists that are also interested in shader writing.

So that's it - my 2006 GDC experience. I've made some friends, hooked up with old friends, and really had a great time. Now I have to get up at 4:30 am to catch my flight home. :0(

GDC - Thursday

Thursday at GDC was cool. The first presentation I went to was by a guy at Factor 5 talking about their new next-gen title, Lair. It was really neat to see the level of detail that they're able to get on their characters. They said that when they hire modelers, they look for people that are really good at modeling and don't worry much about the polycounts. They just tell the guy to build a great looking model. Then if it needs to be reduced, they have a technical artist do that job. I think that's a really good strategy since it uses the strengths of both types of people. The dragon's they're making for the game are around 40k triangles for the base model!

Next I went to a presentation on next-gen modeling for Gears of War. The guy was a vehicle and weapon modeler and gave a ton of useful tips for speeding up the process of creating next-gen assets. One of the main things he does to speed up the high poly model process is to float details on the surface of the geom instead of sinking them into it - even cut lines that should actually be built into the surface - he just floats them on the top of it and when the normal map is created it looks exactly the same. That's a huge time saver.

I also worked on our company's career booth on Thursday. It was fun to talk with people about the projects we're working on at Vicious Cycle and about the job opportunities. If you're an artist or a programmer looking for a job working on fun projects, head over to the Vicious Cycle web site ( and apply!

In the afternoon I attended a session given by Kevin Bjorke at Nvidia about the new version of FXComposer. It's pretty cool because you can use it to edit Cg, and GLSL in addition to HLSL and you can also view all of them running at once in multiple viewports. It's been re-built to be totally extendable also so devs can adapt it to fit their pipeline better.

I finished up the day by attending a round-table discussion for lead artists. They talked about all the lead artist issues like scheduling, dealing with artists that are slow, how to reward people that are good, what to do with artists that want to do one thing but are really good at something else, etc. It was cool to hear.

Friday I'll be giving a presentation about shaders together with Neil Hazzard from Autodesk. That will be fun!

Thursday, March 23, 2006

GDC - Wednesday

I started today off with a nice breakfast omlet from a cafe down the street from the convention center. Then I went and checked out our company's booth on the exhibition floor. We're selling our game engine to other developers so we've got a booth to show it off. Here's a link to the engine web site if you're interersted:

The Vicious Engine

My first session was on cinematic game design put on by a couple of guys at Midway. The point of their presentation was that game design should borrow techniques developed in cinema to enhance game presentation while still maintaining what makes game unique - the interactivity. They showed 9 specific cinematics techniques from film and explained how they translate into games and can push the cinematic quality of a game without turning the game into a real-time rendered movie.

Next I went to the PS3 keynote speach. It was ok, but I didn' see anything that really inspired me. You can read more details on the keynote here.

I finished up the morning in a session by ATI entitled, Efficient Shader Tricks to Impress Your Friends. The presenter showed two shaders he had written and explained how they worked. The first was written for materials that are semi-tranparent and have a volume. It used a variation of offset mapping to create the illusion of depth and looked very nice. The second was a method of lighting terrain with dynamic area lights. It involved a ton of math, but the results were very nice. This presentation will be added to ATI's developer site within a few weeks. After this session I spoke to the presenter about the seams that I'm getting in my skin shader at UV borders. He offered me a few solutions and asked me to email him about it. I'm looking forward to working with him on it to make it work without the seams.

In the afternoon I attended a very inspiring session on character rigging by Steve Theodore. It was two hours long and Steve just really cranked through the material. He has placed his slides online here and I'm planning to study them for the next few months and use the info to improve my character rigging script. That will be fun!

I finished up the day by spending a few hours at our engine booth talking to people about our game engine. That was pretty cool. It's easy to talk about the engine because it's so powerful. I'm looking forward to tomorrow's sessions!

Wednesday, March 22, 2006

GDC - Tuesday

I decided to do a blog post for each day that I'm at GDC so I can have a place to collect all the stuff that I learn each day and share the stuff that I think is cool with whoever wants to read it.

Tuesday was my long plane ride day. The ride was long so I watched Star Wars episode 4 on the first flight and Toy Story on my second flight. Movies on planes are nice. I used to hate flying until I was able to bring my own movies to watch. Now it's not so bad.

On the plane, I also did a little bit of thinking about how to structure a system of shaders for a next-gen graphics engine. I think it would be cool to create a standard list of shader inputs like normal, view vector, light vector, UVs, diffuse color, etc and then make each use a function call to be created. That way I could write lots of variations of functions for each input - like a normal function that combines multiple normal maps, a UV function that does offset mapping, etc. I could build a library of functions for each input type. The main body of the shader would be the lighting function - and I could build a library of different lighting models - blinn, phong, oren-nayar, etc. Then when I wanted to build a new shader, I could just combine all of my various functions to get the results I was looking for. If I couldn't get it with what I had, I could write some new functions and add them to the library. This type of system would allow new shaders to be built quickly, and make all of the shaders work together in an organized system. It's all just at the concept stage at this point, but I thought I'd throw it out there and see if anybody had any thoughts on it.

Neil Hazzard from Autodesk has asked me to give a short presentation on my shaders during his talk on Friday. It's going to be cool to show other people what I've been working on and meet some people that are working on similar projects. Neil also said that they might be showing a shader demo that I made at the Autodesk booth. Nice!

I hope to be able to log some of the interesting tid-bits that I learn on Wednesday in my next post.

Saturday, March 18, 2006

Skin Shader

I just updated my web site with a new FX shader for Max. This one is for skin. Here's a screen shot:

The shader simulates sub-surface scattering by rendering the diffuse lighting in UV space and then blurring it. I got the idea from the shader used in ATi's Ruby demos. This technique was also used in the second and third Matrix movies. I'm also doing some fancy stuff with normal mapping and specularity. I'm really excited about this one because I finally learned how to render into an off-screen buffer and then use that buffer as a texture for subsequent passes. This technique is useful for all sorts of things like glow, depth of field, light bloom, etc. It's really opening up a lot of new possibilities for me. I've already written several other shaders using this technique. I'll be posting them soon too if I can get the time. You can get the skin shader here:

Ben's Shader Page

Leave a comment and let me know what you think.

On another note, I'm going to GDC this year. If anyone wants to hook up with me there and talk about shaders, rigging, or just making games in general, that would be really cool. Just send me an email. I've met a lot of people on the web and it'll be nice to finally get to see some of you in person.

Finally, here are two very cool links related to normal mapping and creating next-gen game assets that I learned a lot from:

Rorshach's Cool Thread on Polycount

Quake 4 SDK Texture Tips

Enjoy them!