Saturday, November 30, 2013

FMP ideas.

I suppose I need to describe the ideas I came up with for my FMP. I did a couple of presentations for the tutors already, but did not document it. So let's start at the beginning.

Given a choice between characters, vehicles and environments, I prefer the latter. Unfortunately, I tend to get tired of working on the same asset for a long period of time. Levels tend to have a lot of smaller assets, as well as elements that require different creative approaches. They may even have differently styled areas, so that's another point.
In addition to my personal preferences, there is a very important aspect called "market demand". Character artists tend to have an extremely strong competition compared to environment and prop artists. There are simply more jobs for general asset creation positions.
Considering all that, it makes most sense for me to make an environment as my final project.

The first idea was to create a large natural environment. I always hated how inaccurate forests are in video games, so this idea would allow me to create a stunning European forest scenery, with some  landmarks such as cliffs, hills, rivers, etc.
The main problem with this idea is that 90% of all assets would be trees, bushes and other examples of vegetation. I do not want to model just foliage for three months, that would make me insane. Another issue is that it's pretty hard to find first-hand photographic reference of lush vegetation in the middle of winter. I do have a large collection of pictures I took in the forest some time ago, but that's not enough. There is never enough reference.
Decision - scrap this idea.

Anno 2070 - example of such an RTS.
Next idea was a mock-up strategy game. I would make a set of modular buildings in a similar style, and would create a framework that would allow me to place them on the ground, that is divided into sectors by a grid. If you played any RTS games before, you should get the idea.
Main issue - extremely limited amount of studios that require that sort of work. In terms of employment, I would limit myself to a handful of studios in EU, and they don't exactly hire on a regular basis. There are more opportunities in North America, but good luck getting work permission for USA or Canada.
The other problem is coding. It's not one of my strongest points, and I don't want to waste time trying to make something work on Unreal Script or in Unity. Luckily, I talked to the person I usually work for as a freelance artist, and he offered to create RTS framework in Unity for me for free. This creates another problem -  I barely know how to use Unity.
Decision - I will not make this as an FMP, but will carry on working on this in my spare time. It's always good to have something besides university work.

And the final idea is the one I'm trying to piece together at the moment. I want to create city level with a couple of visually distinct areas and a lot of routes to explore. I would like to experiment with architecture, and to allow that, I want one area to be quite old, like old Paris, with a gradual transition into futuristic, sustainable eco style.

Art-noveau house in Riga.
I'm not sure on the specifics yet, but I assume the level will be set in not very distant future, when our civilization will have started to experience full effects of climate change, mainly the rise in sea levels. If I decide to take a "dirty" approach, lower levels of the city will be flooded and dilapidated, with new dwellings rising above them. Or, I can take a "clean" route, and make a museum-district of historical buildings protected from the rising water by a dam system, with high tech buildings surrounding the area. I'm still trying to work out what would be more realistic, and artistically interesting at the same time.
Oh, almost forgot - I would like to make old buildings in art-noveau style, such as some old Parisian architecture. It's quite under-used in video-games, and I can get a lot of reference from my home town.
Main problem for this project, of course, would be the scale. The rooftop project has shown me that even a relatively small area requires quite a lot of time to be completed to a good standard. I'm more likely than not will not be able to create such a large environment in just three months. Unless a great deal of planning is done beforehand.
Solution part one - modular approach taken to the extreme. Old buildings built from pre-made "lego pieces". Several varieties of main architectural elements can be combined into many unique-looking buildings. New sci-fi buildings can be made starting from textures - a couple of texture sheets with various panels and tileables, then create geometry for those textures.
An example of billboarding approach in Deus Ex: Human Revolution.
Solution part two - billboarding. A lot of objects in the distance can be fulfilled as pre-rendered images applied to planes. City vistas, skyscrapers on the horizon, that kind of stuff. I don't have to model everything, because those images can be edited in Photoshop. Can't create a large environment? Use optical tricks to make it appear larger than it actually is.

This obviously doesn't solve all the issues. I'm still having troubles figuring out the design of what I want to do. How do I combine futurism and old architecture seamlessly, so that the transition wouldn't be too sharp? What kind of engineering would be used to preserve old buildings from the flood? How to avoid typical sci-fi cliché? I'm still doing my research on all of this. Understandably, there are not many resources available on the topic of building preservation in conditions of permanent flooding. Sustainable futuristic architecture projects also focus either on sea platforms, or buildings built on solid ground. So it looks like I'll have to piece a lot of stuff together before getting a solid idea of what my city is going to look like.

Thursday, November 28, 2013

Vehicle - final.

So, this week I've made quite a few changes to the project. Mainly to the environment. In my last post I described a sky sphere I made. Well, it's history now. The major problem with that sphere was the fact that it was too dark, so the cubemap reflection was pretty much non-existent. Putting some nebulas in the background was not an option, since the unwrap distorted everything too much. I would also have to do something about that planet.
So after doing some research I decided to create a cube, as in old skyboxes, then tessellate and relax the object. The resulting model still has a pretty decent non-stretched unwrap, and corners are smooth enough to not stand out.
To texture it, I first created a seamless cubemap for the skybox, and then projected that cubes diffuse on a tessellated box. Result is pretty nice.


There is a small problem, however. The brief specified that sky panorama texture is supposed to be 4096x1024p. In order to make my cubemap look good, I had to increase texture size to 4096x2048p, so that I would have a 1024x1024 per each face of the box. Something like 6144x1024 would seem to be more efficient, but the width is not a power of 2, which is important for in-engine optimization. So I had to go for a more wasteful size. Luckily, I don't have any environment at all besides that skybox, so I assume that this increase in panoramic texture size fits the definition of "flexible budget".

Reflection cubemap was re-made, but still there were some issues with the actual reflection. I applied the cubemap to a cube, to see if all the faces are aligned. I had to fix some swapped faces, but after that the map looked fine on cubes and spheres. On the vehicle, however, some issues are still present. On faces that were rotated 45° cubemap faces are not blending - only one of the side reflections are showing. There is also a seam that can be seen in the reflection, and it doesn't seem to go away no matter how I swap the faces.
It's not that big of a deal, but it's incredibly annoying.

Then, after making the reflection much more colourful in comparison to previous dark sky, I was able to tweak the reflection map quite a lot. Also, some errors in normal maps became much more apparent. As I wrote before, smoothing groups flip green or red channel of the normal map for some reason. So I left most flat surfaces without any normal maps whatsoever, and where SGs were absolutely necessary, I had to flip red\green channel of the normal map specifically in the problematic area. I know, that quite often when importing stuff to engine, smoothing groups are required to be on all the surfaces, even flat, but since we're optimizing our scene for the viewport display, this approach is a necessity.

To set up- a 360
° rotating camera, I created a closed spline, used as a path, and assigned a camera to move long it (motion tab on the right-side panel in 3ds Max), while targeting the space ship. The path is easily adjustable, and I tried to position it in such a way that it would give the most interesting overview of the vehicle.

Two additional cameras were set up to take the shots for the final submit renders. The large shot below is post-processed in Photoshop to create some effects that would normally be in games engine, such as bloom, light shafts, lens flare, etc. 



And here is the fly through video:


Overall, an interesting project, however I would prefer to have a go at a real game engine instead of trying to make my model look good in the viewport. I see the point why we do it - Codies can't give us the engine they work with, so they re-create shaders with a similar functionality for 3ds Max, so that we had the same limitations. The problem is, these shaders are obviously not debugged, and cause us a lot of problems. It's an interesting mental exercise, but has little to do with what game artists usually do - making a scene look good within constraints of an engine.

Sunday, November 24, 2013

Vehicle, end of week three.

I managed to catch a weird bug somehow, so I was unable to work in the past several days. Luckily, the project is pretty much done.

So, this week I was adding some finishing touches to the normal map, as well as working further on the diffuse and reflection maps. They are almost done, maybe a day or two of work left.
The environment, I assume, is also done. I might tweak some stuff, but I think it already looks quite good.
Originally, I planned to make a hangar of some sort. But after talking to people, I realized that with our current texture budget it's really hard to make it look good. In the end, it'll just make the spaceship look too small as well, so it's just a waste of time. Vehicle is the main priority here, and I've already spent too much time on it.
So I went with a simple sky sphere with starry texture and a bit of nebula haze. The focal point of the sky, however, is a planet with a sun rising from behind it. I tried making the planet a part of the sky texture, but there was just too much distortion. So I had to resolve to making the planet a separate plane.
If I was using UDK, I'd make the sky sphere in a completely different way. For instance, there is a way to adjust the sun position in such a way that it's always in the same position relative to the player. In case of 3ds Max, I have to deal with perspective.
After making the background, I discovered another annoying issue with Xoliul shader. Apparently, it fills empty alpha areas with an opaque grey colour. That is, there is no punch through - the only object that is displayed behind the alpha planes, is the object itself.
I managed to find a tweak for Xoliul code that switches the punch through on, but that also disabled two-sidedness. Bummer.
So I ended up adjusting some settings in the Xoliul code myself. If anyone has the same problem as me, (as in, alpha not being transparent or two-sided), open the .fx file with Notepad, scroll all the way down, and replace the "Two Sided" technique with the following:

technique TwoSided 

    pass  P0
    {       
        ZEnable = true;
        ZWriteEnable = true;
        CullMode = none; //clockwise culling
        AlphaBlendEnable = false; //alphablend allows for full range, smooth opacity masking
        AlphaTestEnable = false;
        AlphaFunc = Greater;
        AlphaRef = 128.f;
        ShadeMode = Gouraud; //required for smooth vertex colors
        VertexShader = compile vs_2_0 vs_main( );
        PixelShader = compile ps_3_0 ps_main( );
    } 
    pass P1
    {       
        ZEnable = true;
        ZWriteEnable = true;
        CullMode = cw; //clockwise culling
        AlphaBlendEnable = true; //alphablend allows for full range, smooth opacity masking
        AlphaTestEnable = true;
        AlphaFunc = Greater;
        AlphaRef = 128.f;
        SrcBlend = One; // additive blening of fresnel stuff
        DestBlend = One;
        VertexShader = compile vs_3_0 vs_main( );
        PixelShader = compile ps_3_0 ps_fresnel( );
    }

}

Before and after:
That stretched planet, by the way, is the reason I had to place it on a separate piece of geometry.

The other thing was trying to sort out the cubemap. The layout specified in the brief was not the actual layout used by the shader. So I had to literally mark individual cubemap faces and swap them around if they were in the wrong place in the viewport. But in the end it works out pretty well.
Still, there is a quite a bit of work I have to do on the reflection map in order to make it look decent. But I'm pretty sure that the project will be complete in a couple of days.

Monday, November 18, 2013

Vehicle - end of week two.

This week was spent on finalizing the unwrap of the vehicle model as well as texture map baking.  Admittedly, I did not do the best job I could, but I will try not to make the same mistakes next time. After all, it was a while since I last tried to fit everything on the same texture sheet instead of working with a bunch of tileable textures.
Originally, I tried to render everything from a high poly mesh, however because of the small size of some of the details I wanted to create, even after baking normals at the 8192p resolution they were too pixelated. So I had to combine height map based normals with baked down details. Even so, quite a lot of detail had to be tweaked by hand in Photoshop in order to achieve the smooth result I wanted.
A very unpleasant issue I encountered was the fact that normal maps were influenced by the smoothing groups. Example - a bit of texture that looks perfect on one surface looks like it has a green or red channel flipped when it's reused on another. Getting rid of a smoothing group in most cases is not an option. Solution I had to resort to was mirroring the UVs of problematic areas. Not the most elegant decision, but since all we have to do is optimize the scene for real-time viewport rendering, that should do.

I'm currently in the middle of diffuse map creation. Right now it's just plain colours with an overlay of ambient occlusion, convexity and concavity. All these maps were rendered using Knald. The reason for using this software is the same as why I based some of my normal maps on images - baking produces maps that are too pixelated. There is still a lot of work to do nevertheless.


Those shaders we were supplied with are pretty fun. One might even like them if they enjoy not having certain functions that people are normally used to when creating 3d models. For optimization, there is no all-in-one shader. Which is perfectly fine - why waste precious calculation cycles on something that is not even in use? This, however, causes some issues when what you need to achieve some weird stuff, like emissive material with transparency. Which, interestingly enough, I needed to do for the "wing" bits of my spaceship. Still, it's fine. In the actual studio I would have an option of pestering the programmer to make another shader. I don't understand, however, is why there is no option to make material two-sided. I mean, Codemasters make a lot of games about cars, they have to make two-sided glass.
Also, these materials can only be affected by one light source at the time. Which is lovely from performance point of view, but makes me very angry.

In any case, after talking to James about those issues, he agreed to let us use Xoliul shader for those specific bits of the model. This solved my problem with emissive semi-transparent material, but created a new one - apparently Xoliul does not handle transparency gradients, and can only create a clipping mask. Well, too bad for me. I just said "screw all this", and made a different design of that forcefield glow. Now it's a lovely hexagon grid. What's important, it's two-sided and emissive.

Note to self: take more progress screenshots.

Saturday, November 9, 2013

Vehicle project

The brief

The goal of this project is to create a vehicle and a small environment for it. Both must be fully textured; provided shaders must be used instead of standard 3ds Max shaders. Final scene must be appropriately lit, and a high-rez render featuring the vehicle from it's best angle must be produced.

Example: a sports car in a garage.

Budget

10000 triangles for the vehicle
10000 triangles for the environment

Vehicle:
Diffuse with alpha transparency RGBA – 1024px by 1024px.
Diffuse with alpha reflection mask RGBA or  reflection mask RGB – 1024px by 1024px.
Emissive RGB – 1024px by 1024px.
Normal Map RGB – 1024px by 1024px.
DDS cube map 256px face.

Environment:
Either one 1024x1024 map or a set of smaller tileable textures.
One large 1024px x4096px image for sky domes / HDR panoramas.

Schedule

Week 1:
Reference gathering, vehicle modelling and unwrapping.
Week 2:  
Vehicle texturing, environment modelling and unwrapping.
Week 3:
Environment texturing, scene set up.
Week 4: Tweaking and polishing.

Workflow

Currently, we are almost at the end of the week one.
Since the brief stated that the vehicle will be seen from all angles, and our texture space is quite limited, it would make more sense to make something that is not too realistic. Normally, cars are sitting on their wheels and it's a bit hard to see what's underneath unless it's lifted in a garage during a maintenance. I do not have the time or budget to create a level of detail required for such a scene.
So I decided on maybe not the most original idea, but more feasible in current situation - a space ship. It can be as detailed as I want, and can be easily seen from all sides.

After gathering some reference, I drew some shapes in Photoshop in order to settle on the overall design.
I chose the one I liked most, and made a quick model to see how it would look in 3d.


It did not turn out as good as I wanted it to be, so I chose a different design, which I settled on.

Main critique I received about it was about the solar sails - they were too small for such a big ship. I tried to develop a more complicated design based on the skeletal structure of bird wings.

However, the triangle limitations did not allow me to position a lot of individual "feathers" along the beam. I settled for less dense, but more interesting design. Along with and alpha plane with a semi-transparent gradient.


The next stage is unwrapping, which I'm currently in the middle of. It's a bit of a challenge to position all the details necessary on a 1024x1024 sheet, but I'll manage.

Friday, November 1, 2013

Rooftop project - final renders

For my rooftop project I wrote the design document in a MS Word file, which is sufficient to describe my thought process during development. I would just copy it here, but Blogger's auto-edit function is going crazy when I do it. It's impossible to create a correct mark up. Even if I use HTML exclusively, the system will try to adjust my code.

So, if you want to read about the development of this level, here's the link to the design document file.

Nothing stops me from posting the final renders, though.

And here's the fly through: