Difference between revisions of "HowTo:FullUnwrapBlender"

From VsWiki
Jump to: navigation, search
(Materialize it)
(More cleaning up)
Line 146: Line 146:
  
 
What I did was push the edges, up and down respectively, until they barely penetrated the surface of the wing.
 
What I did was push the edges, up and down respectively, until they barely penetrated the surface of the wing.
 +
 +
And sorry if I'm repeating myself, but flipped normals... You need to find them all. I just went into a major hunt for flipped normals and found probably 200 of them. Does it, or does it not look "cleaner" now?
 +
 +
 +
http://deeplayer.com/dan_w/WCUships/Cutter/Cutter34.jpg
 +
 +
 +
Speaking of normals, you can save yourself major pain by NOT using "Ctrl-N Normals Outside" once you've done your smoothing groups. Blender's algorithm for telling inside from outside is not too smart; and while it works well with closed meshes, it does a disaster once you've split smoothing groups, because, when in doubt, Blender looks at the normals of neighboring polygons; but it won't find neigboring polygons that have been split.
 +
 +
To find blotched normals, one trick I've found is to flip flop the Double-sided button. Turn the ship to get a close view of one area at a time, then press F9 and you'll see the Double Sided button there. It should be off. Turn it on and off repeatedly. Nothing should change in the picture if all the normals are right within that view. If anything changes color, there's a blotched normal there. Make sure you have the Show Normals button, and adjust their length. Faces whose normals are reversed will have just a tiny blue dot in the middle. Highlight them and go W -> Flip Normals.
  
 
=== Think Hard First ===
 
=== Think Hard First ===

Revision as of 19:59, 7 May 2007

Intro

Okay, so you've read the other tutorials but still get frozen in front of the screen when it comes to unwrapping... Yes, it takes a lot of planning and preparation, and I'm still waiting for a half-decent automatic unwrap script. Whatever time automatic unwrappers save you in unwrapping, they take back 5-fold when it comes to texturing. Anyways, if you're like me, I hate oversimplified tutorials, like how to unwrap a cube. It tells me nothing about the actual work of unwrapping a whole ship. And too small a ship to unwrap would be similar to just a cube. You want to know how to unwrap a big, complex ship, right? You're in the right place now...

We're going to unwrap this baby:

Cutter14.jpg

Cutter15.jpg

Cutter16.jpg

Cutter17.jpg

By the way, if you haven't been introduced, this is the Cutter Class, a small capital ship --a corvette-- that I came up with for WCU's Wing Commander Zero project. We had a need for a corvette, but couldn't find any WC1 corvette other than the Venture Class, which is a lightweight, fast corvette for reconoissance. We needed a corvette that would make for a good transport and be able to serve as carrier escort --i.e.: be able to take some heat off the carrier and survive, rather than survive by running away.

Ready?

Clean up the mesh

First of all you need to make sure that you are 100.00% happy with the mesh. Not 99.99%. Why? If something shades funny, you won't be able to "fix it" with the texture, --other than by painting it matte black, that is; but you probably don't want to do that. You need to find your errors and fix them all. Typical mesh errors are split polygons that you didn't mean to split, non-split polygons that you did mean to split (read the tutorial on smooth groups, if you don't know what I'm talking about), missing polygons, inner polygons and edges shared by 3 or more polygons, free floating edges with no polygons... You need to clean all that crap first. One very useful trick is, from the Edit mode Select menu: "Non-Manifold". It's hard to explain what it does, so try it and get used to it. All mesh edges and splits will be selected, so you can make sure all your sharp edges are indeed selected. And if you find any edges selected that you didn't expect selected, they probably have coplanar or inner polys. It will also help you see missing polys. Another thing you should do is unclick the [Double Sided] button, to make sure you catch inverted normals.

If you work like I do, you probably have one or two dozen objects spread through half a dozen layers. For unwrapping we'll have to put it all back together in one piece. Well, two pieces really:

  1. The big parts
  2. The tiny parts

How big? How tiny?

The tiny parts are those parts so tiny we don't even care to texture them. In this case, all the hand-rails and ladders. What? You can't see them? Well, you shouldn't be able to see them. Let me get a close-up shot. Hold on...

Here. Notice the ladder, bottom left, and the scaffolds at the top?

Cutter18.jpg

There's scaffolds at the bottom also. I just added a couple of yellow lights to make them more visible.

Cutter19.jpg

Not saying you should have ladders and scaffolds; I use them as a way to give players a way to judge the size of a ship. Windows help also.

In any case, I was saying I don't care to "texture" the hand rails and posts. They are too thin for even one pixel. Well, maybe not too thin for one pixel, and perhaps them being illuminated by yellow spotlights might look good... Okay, forget it; we'll unwrap everything. Except the subunits, that is: The gun turrets, for example, will be sub-units, because they have to be able to turn. So they'll have their own texture. But we still keep their geometry, because we need their shapes to cast ambient shadowing during our bakings. So, we'll leave them in, but put them into a separate object that we won't UV-unwrap. Anything else you don't want to unwrap, put it into the separate object.

So, other than such exceptions, we want to have the whole ship be a single object. But now, chances are you may have scaled or rotated some of your objects. Chances are some are mirrored in the Y axis; --not just the X axis. Some may have a sub-surf modifier. Some may be curves (like pipes, for instance) rather than meshes. And some objects may be things you put there and meant to clean up later but forgot.

So, first you need to go object by object ... Best way to do this is by clicking on one object at a time in the outliner window; that way you don't miss any...

blender_shot_1sm.jpg (Full Size)

...and for each of them you apply any attributes other than X-mirroring, click on Center Cursor (assuming your cursor is at the origin; otherwise send it there with Shift-C), and then Ctrl-A to apply any scalings and rotations you may have done in Object mode. Otherwise you could have your normals all messed up (scaling and rotating objects in Object mode doesn't recalculate the normals until you apply it to the mesh). Then Shift-Right-click on the main object and Ctrl-J to join them. Once you're done, you'll have a single object.

Materialize it

Our next step will be to assign materials --i.e.: color our ship. Why color it in Blender when we're going to texture it? Because during texturing it is almost impossible to know what a color in the texture will look like in-game. Suppose you're trying to make a coil look like it's made of copper. How much red, green and blue do you need in the diffuse texture? How much of them in the specular? Unless you have access to a material's optical characteristics database that I've been googling for on and off for months without success, your only way to get things right is by eye. But to experiment with each material in the texture and try it in-game is insanity. It takes forever. Blender's renderer produces results that are pretty close to what you will see in-game, so the right time to get the materials right, is right now. And when we're done unwrapping, first thing we will do is bake a diffuse texture with the material colors. That baking will serve as a base and background for our texturing work.

Plus, grouping our UV islands by similar colors will allow us to use our texture area more efficiently. Don't believe me? We'll get to this point shortly, but for a quick nutshell: A problem common with mip-maps and trilinear/anisotropic filtering in hardware is that there tend to be "leaks" of color between adjacent UV islands. One common way to try and avoid such leaks is to put extra pixels of the same color around islands, which forces one to have "wasted space" around islands. But if two islands are the same color or pretty close in color, such leaks will be less obvious, allowing us to put less, or no-, "padding" between them. So it is more efficient to group islands of a similar color together. By defining our materials in advance, we can, during the unwrapping, select facets *by material*, and unwrap those as a group, pack them all together, and later fit them in an area of the texture as a block.

As with the mesh, take your time and make sure you are 100.0000% happy with the materials now. An extra hour now is like 20 hours saved later.


Cutter21.jpg

Cutter22.jpg

Cutter23.jpg


Yeah, don't blame me about the green paint. If you know about Wing Commander, you know all Confed ships are green. And this is a much more modest shade of green than in the original games; believe me...

I'm using more materials than you probably think you are seeing:

  • The main hull, I call its material "titanium" and it's [0.3,0.3,0.3] diffuse, [0.6,0.6,0.6] specular, hardness of 40.
  • The turret and pipes: "aluminium", [0.4,0.4,0.4] diffuse, [0.5,0.5,0.5] specular, hardness of 20.
  • The engines and dock: "stainless", [0.1,0.1,0.1] diffuse, [0.8,0.8,0.8] specular, hardness of 50.

IMPORTANT NOTE: Beware of the evil "default material" in Blender. The default material is evil because it is totally unrealistic: It is way too bright; --white in specular, and almost white in diffuse. No such material exists in the real world, nor could it ever exist... The sum of specular and diffuse, for any component (red, green or blue) can never add to more than 1.0, or else the material would be reflecting back more light than it receives. Rarely the sum of the two is so high even. The sum of specular and diffuse brightness are called a material's "albedo", and most material's albedos are around 0.1 to 0.5. White chalk and a mirror would have albedos close to 1 (the former all in diffuse; the latter all in specular). But a material cannot be as white as chalk in diffuse AND reflect in specular like a mirror. NO such animal. And if you use the default material, you'll end up setting your lights really dim; which means that you'll end up with absurdly bright materials if you fine-tune them while rendering with such dim lights. So, before you even set up lights for rendering your model in progress for the first time, define a material like my "titanium" above, assign it globally, and delete the default material off your face for good. /IMPORTANT NOTE

I also have a "dull grey" that I use for the boardwalks, and for the floors in the dockings. This dull grey is dull in the sense that it has no specularity --i.e.: is black in specular. One always needs one such material for surfaces that would, or rather 'should', reflect other parts of the ship. Well, all parts of the ship pretty much would reflect other parts of the ship, from the right angle; but what I mean is parts of the ship that should reflect other parts of the ship from "a lot of angles". You want to dull down specularity there because the trick that makes specularity happen, so called "environment mapping", will NOT reflect other parts of the ship. So rather than have an inconsistency or artifact, I prefer to trick it out of my face by simply having non-specular or low-specularity materials in key places. One such keyplace here is the floors of the launch/land bays. Specularity there would be disastrous because one would expect the lights inside the bays to show again as spots of light reflected off the floor, as if the floor was transparent, and the reflected light was under it. That's not going to happen unless we define the floor as a "mirror", which is a whole different kettle of fish. So, for a simple solution, we make the floor completely matte, like a piece of non-glossy cardboard. Come to think of it, I should make my walls and ceiling perfectly matte there too. I'll do that and post a new render.

Another use for matte materials is large flat surfaces. Environment mapping is a clever and efficient but crude way of simulating specularities. If you make a large, flat surface specular, you're really putting the limelight on its crudity. I avoid that like the plague. The best use of specularity is for curved surfaces. The more curved the better. That way, all your eyes see is these distorted patterns and highlights moving about in weird ways, looking very much like reflections. But if you have a large surface reflecting, they you would expect to see a reflected "image"; and you kind of see one, the sky-box; but pixelated and horrible, not like what you'd expect a reflection to look like, at all.

You'll be glad to know that I'm following my own advice: As rushed as I am to get done with this damned tutorial and this ship, I'm still editing the mesh and fixing details. Some of the pics above are obsolete already... For example, I found that the ladder was too big by a factor of two. So I put a thinner ladder, and added a short plank-walk to the engine at the top of the ladder, to justify it as some kind of EVA maintenance access to the engine. I also found the interiors of the bays too poor in greebles, details, and size references; so I added ceiling lights and human-sized doors in the side rooms. Okay, give me a few minutes and I'll post a render...

Here we go:


Cutter25.jpg


Just in case you wonder, the "YellowLight" material is not emissive there; just 'Shadeless'. I never quite figured out emissive materials in rendering; sometimes they they seem to work, sometimes they don't; but even when they do they don't seem to cast shadows, so I use plain lights and spotlights; so the light fixtures are fakes, really...


blender_shot_2.jpg


Alright, I won't add any more greebles in the bays. Tell you why: My idea is for the bays to eventually be sub-units. The bays need to be functional: when you land, they should arrest your ship's motion, and suck it into an air-lock, then move it inside to a pressurize parking spot. I'll work on that eventually, and when I do, I'll fully greeble the interiors.

In any case, I'd advise you to play with different color schemes until you know you won't be changing your mind...


Cutter26.jpg

Cutter27.jpg

Cutter28.jpg

Cutter29.jpg

Cutter30.jpg

Cutter31.jpg


... because once you've grouped your UV islands by material, changes to the color scheme may force you to reorganize your groups, or else to allow the grouping to be compromised.

During this process you may spot a lot of mesh errors and possible optimizations...

More cleaning up

Watch for pairs of triangles that can be turned into quads and do it; and merge unnecessary vertices. Don't forget to go into line selection mode and menu Select -> Non Manifold, from time to time, watching for lines appearing in the middle of a smooth surface where they shouldn't appear, or missing from sharp edges --where they should always appear. This is the most efficient way to find cracks, internal triangles, blotched smoothing groups and missing facets. I write this because I thought I was done with this mesh, but I'm still finding a lot of areas needing fixes and improvements; --which is why this tutorial is going so slowly.

Also, it's extremely important to minimize the amount of hidden, invisible surface areas. There's many reasons for this; but first of all, what do I mean? I mean, for example, those three square boxes I have at the top, and then again at the bottom of the ship. Originally I put them in as vertical boxes that crossed the whole ship, top to bottom. Later, I cut the boxes so that they barely penetrated the skin. But before finalizing the mesh, one has to cut the skin to elliminate the squares covered by those boxes. Small boxes and things, like the little clamps, though, can just float and cover; but those six boxes are just too big for that. Now, the two main reasons why...

  1. The GPU (Graphics Processing Unit; the brains of your videocard) has no way to know that a portion of surface is not visible and disregard it altogether. It does display correctly but by brute force: It checks as it draws each pixel that something isn't drawn in that pixel already that is closer to the camera than what it is currently drawing (AKA "Z-testing). But even if it decides not to *draw* that pixel of the skin (because a pixel of the box was drawn earlier, and is closer to the camera), it still ended up having *read* that pixel --in order to find out; which is a memory access all the same. If in one area of the screen you have 17 polygons, at best, the GPU will write the pixel only once; but it will end up having read it all 17 times. This is called "overdraw", and is one of the prime factors limiting performance in games. Hidden surfaces aren't just wasted; they slow down refresh rate.
  2. Hidden surfaces waste texture texels: The larger the hidden surfaces, the more texels are wasted on them. To get the best results and highest detail out of the smallest texture, you need to up the efficiency; so hidden surfaces are out. And, before you ask, no, you cannot place something else over a hidden area, because we'll need an "ambient occlusion baking" that Blender will make for us, but you cannot have overlapping UV islands, or else the occlusion baking will be incorrect. There's really no other solution than to cut off covered/hidden surfaces.

One good way to find hidden surfaces and elliminate them is to take a look at the inside of the ship. In the pic below, we're inside the hull, looking towards the back. You see rectangular depressions at the top and bottom, where those boxes are. You also see horizontal slots to the left and right, near the back. Those are the interiors of the "wings". And inside the slot on the left, you see these bright lines along its "floor" and "ceiling". Those are the edges of the walls of the inner rooms in the dockings, penetrating the wings. I feel they are penetrating too much, and will waste too many pixels...


Cutter32.jpg


So, I decide to do something about it:


Cutter33.jpg


What I did was push the edges, up and down respectively, until they barely penetrated the surface of the wing.

And sorry if I'm repeating myself, but flipped normals... You need to find them all. I just went into a major hunt for flipped normals and found probably 200 of them. Does it, or does it not look "cleaner" now?


Cutter34.jpg


Speaking of normals, you can save yourself major pain by NOT using "Ctrl-N Normals Outside" once you've done your smoothing groups. Blender's algorithm for telling inside from outside is not too smart; and while it works well with closed meshes, it does a disaster once you've split smoothing groups, because, when in doubt, Blender looks at the normals of neighboring polygons; but it won't find neigboring polygons that have been split.

To find blotched normals, one trick I've found is to flip flop the Double-sided button. Turn the ship to get a close view of one area at a time, then press F9 and you'll see the Double Sided button there. It should be off. Turn it on and off repeatedly. Nothing should change in the picture if all the normals are right within that view. If anything changes color, there's a blotched normal there. Make sure you have the Show Normals button, and adjust their length. Faces whose normals are reversed will have just a tiny blue dot in the middle. Highlight them and go W -> Flip Normals.

Think Hard First

Here's a list of constraints and requirements to get a "good unwrap" going:

The goals are:

  1. To have the least amount of stretching and deformations
  2. To have consistent scaling of the texture across the whole ship
  3. To minimize the number of seams and islands
  4. To have the arrangement of the islands so that locating a part of the ship in the textrure is intuitive, rather than requiring a throrough search.
  5. To have front and back view unwraps all together in one area of the texture, and all side views in another. The two areas of the texture should be well separated, hopefully across a single, horizontal line.
  6. To have all "side views" (including top and bottom) as a series of rotations, sort of like a cylindrical unwrap unrolling vertically.
  7. To align the front-to-back direction (z axis) horizontally on the texture (u-axis).
  8. To orient the front of the ship (positive z-axis) towards the left on the texture. This is so that, to produce dirt trails and scratches that should have front to back fading, we can do it in Gimp using horizontal motion blurs globally, rather than have to do laborious, region by region blurs, depending on the orientation of each island. Also, my texturizer software, when it's done, will assume that the front of the ship faces to the left on the texture, and produce dirt smears and scrathches by smudging dirt spots and impacts towards the right.
  9. To avoid "flipping" islands or polygons. A flipped island on the texture results in the polarity of the bumps on the normal map being reversed.
  10. To avoid overlapping or re-using islands (unless using dual UV-layouts) because radiosity baking and PRT bakings cannot work with overlaps.
  11. To avoid Islands touching, or even coming too close to each other; --except along an edge that they share on the model itself; --in which case they could (or rather should) be "stitched" together.
  12. To try to group islands by color or material, so that color "leakage" between islands due to gpu anisotropic filtering is of a similar color, and therefore less noticeable.
  13. To try to keep islands housed in rectangular areas, power-of-two pixels sized; and to ensure these areas have their starting x and y coords at an integer multiple of their x or y size respectively. I.e.: If a long strip island has a size of 64 pixels in x and 16 pixels in y, good placements for the rectangle in x, in the texture, ar at x=0, x = 64, x=128, x=192, etceteras. That is, 0, 1, 2, 3, etceteras, times its x-size, 64. Good placemtents in y are 0, 16, 32, 48 .... same idea. Why? To avoid, or rather minimize, mipmap color leakage between islands. Mipmaps are recursive reductions of a texture by powers of two, using block averaging (4 pixels are averaged into 1). So, if two islands are separated by a row of pixels at x or y = 77, mipmap leakage will start much earlier than if the boundary between them is at x/y = 64, for example.
  14. Finally, to, --as much as possible--, make efficient use of the texture, while upholding the previous standards.

Easier said than done, let me say it :) The day someone comes up with an automatic UV-unwrapper that takes all the above into consideration, that will be the day...

But anyhow, read and re-read the above list until you wake up in the morning thinking about it, and next we'll start placing seams, while thinking about all that...

Placing Seams

...

(Last step: Align vertices near x=0 to x=0, apply X-axis mirroring, and place the central seam.)

Optimizing ship orientation for UV unwrapping

(Z is "up", Y is "forward"? Got to experiment first...).

Worry not, though; we'll put it back to "Z is forward" after the unwrap. It's just that Blender shows the top, bottom, and side views vertically, when your forward axis is z, which is too bad if you're unwrapping "from view"... because we want the forward axis horizontal and pointing to the left in the texture...

"Starting Big" in Potato Mode

Do the biggest parts first.


(2 be continued; this is a WIP --Work in Progress)