Up to this point Ive only made characters for Quake III and Unreal2k4. Im looking to update my skills so naturally Ive many questions.
High Poly modeling and normal mapping seem to be the next step. First question what consititutes high poly? All I managed to find in a nights search was an outdated HL2 FAQ that said between 3000 and 7500. Secondly, what does normal mapping achieve in-game? Ive produced some using Texporter in Max 6 and have seen them inside the belly of Doom3. All I know is they are made of pastel rainbows. Last and perhaps most important question, what should I shoot for Doom3, HL2, or another? Im using Max 6 but as I mentioned can make Normal maps with plugins. I love CStudio but am competant with bones, should that be an issue.
Replies
Basically, for normal-mapping, you use subdivided (Meshsmoothed) polygon geometry, and use a plugin or application to render the meshsmoothed version of the model down onto an "in-game" resolution mesh. Between 3000-7500 polys sounds about right for the in-game model, but there's no limit on how many polys you use on the original high detail version. That head and helmet there is over 100,000 polygons, but I could make a mesh to fit around that in about 400 polys, and render the normal-map onto the low-poly mesh.
Here's some more info in a tutorial I wrote - it's Max 7 specific, but you should be able to apply some of the techniques to Max 6 and whatever normal-mapping application you're using.
Tut: http://www.cgchat.com/forum/showthread.php?s=&threadid=20424
Hope that helps you some.
MoP
The above example- the vents, could that be just a plane in the low poly?
How far can you push this?
Workflow. high->low-> UV map high?(or low?) ->texture ???
or low-> high->...etc?
- Rough low poly mesh to "mass out" the model (no detail, but no optimisation or thought towards mesh flow or deformation).
- High poly model, meshsmoothed. I usually do mechanical parts purely in Max and organic pieces in Zbrush, but you can do this step any way you want.
- Low poly mesh (I usually build it from scratch), triangulated, with attention to deformation and mesh flow. I try and match the silhouette as closely as possible, although the "interior detail" (areas that won't show up in silhouette) doesn't need as many polys, this can be handled by the normal map.
- UV map the low poly mesh - the high poly model doesn't need UV-maps at all if you're just generating a normal-map. However, in some apps you can render down other details from the high-poly to the low poly (diffuse maps, shininess, opacity) so there are some cases where you might want to map parts of the high poly mesh. It's not necessary though.
- I would usually base the diffuse texture on a GI lighting bake of the high poly model onto the low poly model's UV's. You can do this in Max7, I know for sure. Then just paint over that in photoshop to get the colours and stuff.
Bear in mind that's just the way I do it. There are many different approaches, this one just works best for me right now.
As for "when does it not look right", that really depends on the target engine and game style. Usually it's silhouette that counts most, since normal-maps can't recreate that, so i'd say for wheels and stuff you still wanna keep the number of sides as high as possible. However you could have a perfectly flat front to that tyre, and it'd probably look fine with a normal-map, from a distance anyway. It wouldn't hold up so well up close.
The vents in her helmet could very easily be just a plane in the low-poly version. Since you'll never see them in silhouette, the normal-map would be doing all the work, so it'd hardly need any geometric detail at all.
Hope that helps.
MoP
Anyway, I'm in the same position as Dio. I have made some low-poly characters and a few highpoly (that looks terrible, but anyway) so I have some questions too:
1. Can I start with the lowpoly mesh and then just do a clone, add detail, maybe a turbosmooth and call the clone my highpoly. Essensialy the other way around from what MoP is doing.
2. About what Eric said in the cgchat thread:
"MoP, good one. Thanks for this.
I think it's worth mentioning that you can mirror and overlap your UVs as much as you like... just make sure to move all the UVs 1 unit out of the 0-1 UV box, leaving only the non-mirrored UVs and only one of each overlap UV within.
We do this so we can still cast the normals accurately, but keep the mirroreds and the overlaps in the correct alignment, since they're offset exactly 1 UV unit. The only difference is that they're sitting outside the 0-1 casting area, so they don't cause Render To Texture problems.
Thanks again MoP!"
When do I need to move the UV? On which version, the lowpoly or the highpoly (as MoP said, sometimes you want to UV-map the highpoly model too)? There wouldn't be any problems with moving the UVs back in after they have been moved and served purpose outside the warm and happy glow of their cage?
Thanks for the tutorial MoP! Between this and Poops' video tutorial I might get a grip on this fancy, shiny technology any day now .
Yeah, you can definitely use the workflow you described. Bear in mind, though, that if you make any major changes to the silhouette or overall shape of the model while adding detail, you will also have to adjust the low poly mesh to match.
When you want to move a mirrored or overlapped UV segment of the mesh (only on the low-poly mesh - you wouldn't need to move any highpoly UV's, if you're even using them), I would make sure you're using Chuggnut's UV Tools (if you're using Max - www.chuggnut.com ) since they incorporate a useful type-in box to shift selected UV's by an absolute amount - so you can just type "1.0" in the U field, hit Move and your selection will be moved exactly 1 unit along the U axis, basically leaving it in the same place but just outside the "renderable area" as Eric describes.
You wouldn't even need to move them back in to the 0-1 UV area after rendering the normal-maps, since they would receive texture co-ordinates in the same manner when applied in Max. If you really wanted to make sure though, you could just save a copy of the file with mirrored/stacked UV's intact, then move the mirrored bits out of the way, render the normal-map, then load up the original model and apply the normal-map to that. That would be the fastest method.
MoP
This is entirely dependent on the Engine the map is destined for use in. Some engines allow mirroring correctly, some allow it but have wierd artifacts if you do it on a line of verts (see Doom 3's seam heads), and still others Mirroring won't work correctly at all (down becomes up etc).
Worth checking which Engine it's for first.
Some of the details are covered in this Nvidia paper, incl. both artist-friendly pics and some of the code that's needed to fix it...
http://developer.nvidia.com/object/gdc_tspacereal.html
1 level) No mirroring whatsoever. Everything has to be unique.
2 level) perfectly symetrical mirroring. You have to divide the entire model down the center, and everything is just flipped over to the other side.
3 level) Creative mirroring. The best solution but hardest for programmers to implement. Will take into account the W direction of the UV's, and do a calculation for each time it changes so that you can mirror in the same way we have been doing on color maps only.
Apparently level 2 is all most programmers have/been able to get working so far, but many engines are bringing level 3 online now, as the artists demand it. 8-)
The whole model is mirrored but the center seam isn't very obvious (it's visible on the back of the neck but nowhere else).
KDR, that's cool. Have you figured out why seams appear on the default Doom III models?
I thought nv's meshmender lib was exactly for the "automatic" splitting of vertices when they are mirrored uvs and such ?
#3 is a preprocessing step, you create "unique" vertices for the "border line" of a uv chunk by duplicating, cause those are the critical ones. as I wanted to have this in my own engine too, I hope that nv lib would take over the work ?
Found this solution here: http://www.monitorstudios.com/bcloward/tutorials_normal_maps12.html
The seams were gone in 3dsmax, so I guess it should work in other engines also.
We have an additional set of needs for our surfaces in the way they're able to blend between shaders, UV sets, normals (smoothing groups), bone weights, etc., so we're working on a custom solution for massaging the directions of the incoming light vectors. Which will give us not only normal map tastiness, but also some other interesting surface effects. Almost there! I can just taste it...
Floyd, I guess that solution works OK, as long as you're cool with your surface being totally smooth along the seam. Isn't that what you get? I think it kind of defeats the model if it has defined musculature or bunching cloth or other cross-wise creases/folds.
I also have a question about normal mapping which isn't worth opening yet another topic about,I hope Dio doesn't mind .
This maybe a simple prob but as its my first attempt at this new stuff I have no idea how to solve my problem.
basically I have my high/low models I have mapped the low poly model and generated the Normal Map using ATi's map gnerator and max tools (im using max 6 btw).... the normal map is generated and looks fine when i open it up in PS.
But when I then look at it on the model in the ATi viewer that comes with the ATI map generator the UV co-ordinates on the low poly model have gone all over the place. Any reason why this is happening?
Thanks in advance,theres hope for me yet
john
KDR_11k, good thinking, the Doom III models do look like they might have deleted the mirrored tris... But in your model there's still a seam anyway? Sorry if this is an obvious qeustion, but did you add a 4-pixel skirt around your UV chunks? Maybe it's just an id optimization instead.
I got there...sucsess!!! I feel I have achived something. It seemed there was a prob with the UVs,got past that somehow after some trial and error.
ill do an image dump and some point in P&P of my latest stuffe....just some simple things hehe
John