Hey guys,
I've been working on some assets for a mobile/iPhone game and have been having some fun(!) issues with my normal map bakes. Due to the low resolution nature of the geometry I'm working on I either get problems with the normals averaging or getting seams. I've been really tempted to just paint out the issues in photoshop but thats lame and I wanted to pick your guy's brains and see if I could get some advice on getting better bakes.
My meshes:
So, I baked onto my original low resolution mesh and got all kinds of nastyness. "Aha!" I said, and proceeded to add some control edges to get rid of it. On my next bake I found more nastyness, only in seam form this time.
At that point I figured the seamage was due to the corners of my mesh being about 90 degress. I beveled the edges and found the results to be the same. This was the part I found really confusing, even with more geometry added and the edges beveled I still got these seam issues.
I know there must be some way of getting better bakes, but after days of baking and tweaking and rebaking I figured I'd try and get some help.
So what do you guys think? Suggestions?
Replies
One way around this is to use smoothing groups on the different sides and break the UV's off by smoothing groups. It's more of a pain to texture and creates more runtime verts, but the seams on your maps will go away even though your geometry is low res.
You have to understand the the point of a normal map is to replace the mesh normals on a per-pixel basis, with that in mind, the image of the normal map bake makes perfect sense.
Painting out the "errors" would only make things worse.
Basically, because the original map didn't come out like I'd expected I assumed something was fishy and didn't throw it on the mesh to look at it (ow...my pride). So all the previewing and fussing about with my different meshes was just making it worse and I was trying to make the worse better with more tweaking.
Looked at the original map in Unity and in marmoset and sure enough the shading was how I expected it to be. Lesson learned I suppose, always preview your maps *on* the mesh.
OK, so different mesh this time. This one shows the errors more clearly, plus I have some in engine shots as well (yay).
So...here are my meshes. First one is the straight up low resolution, second one is with control edges add along the two edges that needed them the most (farthest distance apart), and the third is the mesh where I added control edges along almost every edge.
Here are the normal map bakes from those meshes. You can see the first two have a gradation due to the normals getting averaged across the large polygon faces (right?).
And here are the shading errors I'm getting with said normal maps. These are in Marmoset but I get the same deal in Unity. The top meshes are just using the image based lighting. The lower has a point light right above each mesh, AKA the third model is shading correctly.
What I gather from these is that I'm getting this gradation in the normal map because the normals are getting averaged across too far of a distance right? So I add the control edges in there to kill it, and it does. Now my problem is that in my last bake with the control edges I get these seams/pinches/creases along the edges. This makes them look like this, which I find undesirable. As I should right? Doesn't look very good.
Back to my original question. I can currently think of two ways to fix em.
1) Do an exploded bake with a UV seam at every hard edge. This would get rid of the edge strangeness but would take more time and almost double the vert count as most of them would double up due to the breaks in the UVs.
2) Do some photoshop work to paint out the edge areas with the default normal color. This would be faster then #1 but I find it to be bad practice plus if I have to bake them out again I'd have to redo the work ect.
So...is there any better way of doing it? Neither option is very enticing and I just wanted to know if there's something I'm missing or if everybody just goes with one of those two options. Thanks! :thumbup:
Would splitting the UVs among the hard edges add significantly more verts than the extra control loops you've added? This part of the wiki might be relevant.
Also, is your normal map inverted in those pics? The edges seem... extra edgy.
If you split smoothing groups, you must splt UVs and ailow a bit of padding. This is just a tangent space normal map rule of sorts.
If you have just 1 smoothing group, even on a basic box, you unwrap however you want and as long as your baker and engine are synced up tangent-space wise, it will work wth good results. A few 'support edges' will reduce the gradients on the normal map, making it a bit more usable for LOD meshes or suchlike, and maybe alleviating some problems in certain engines.
Give it a try with 1 smoothing group, and if you are working through this in 3dsmax, pick up the 3pointshader, it has a better sync with 3dsmax viewport with the quality mode option they provide.
good luck!
cw - Thanks for the explanation, these are going into Unity so I'll need to do some research and see if there's anything we can do to get the tangent space to jive better.
I didn't mean to come off as someone who doesnt read documentation, I've read the wiki and searched :thumbup:. I guess I just figured there must be some other way, turns out I was looking for something that's not there.
I appreciate the help guys.