How do you avoid weird artifacts while baking normals?

  1. The slimy look was caused by sampling the normalmap as Color instead of Non-Color_Data.

  2. The best technique to get a clean bake on hard surface models is to have a minimal bevel (1 segment) on the low-poly, then edit the normals in a way that the orientation of the normals is decided by large faces around it. Blender 2.80 has the Weigted Normal Modifier to do this, for Blender 2.79 this addon can be used to do the same: Weighted Normals Calculator. This technique requires high-poly to low-poly baking, not baking from multires. The problem is that Cycles has a bug that prevents baking correctly with custom normals, but Blender Internal could do it.

  3. A baking cage can also help if there are opposing faces close to each other but I think this particular model doesn’t need that but who knows. At least it’s clear that those artifacts are not caused by the lack of a cage. The problem with that is that Blender Internal can’t bake with a cage.

  4. So to get both techniques to work together you have to bake in a program that can bake with a cage using custom normals. The easiest way to do this from Blender is using the [Addon] GYAZ Handplane Baker Bridge addon that makes it possible to the bake with Handplane Baker, a small program that bakes from highpoly to lowpoly, from within Blender, never leaving it.

  5. Alternatively, you can model the gun using hard edges and use the bevel shader in 2.80 or 2.79 (unstable version) to do the bevel. This is the fastest workflow but can only be used with thin bevels since it’s only a shading effect. This shader can be baked down to a normalmap without any problem. There’s one requirement: all hard edges must have a seam, otherwise the baked normalmap will come out wrong. Whether it’s for you, it depends on how you want to use this model, if it’s for a game, this technique is more than good enough. Although, if you need very close shots with photorealistic results, it may not be convincing enough.

  6. Another thing to try is to bake an object space normalmap, this could have better results since tangent space normalmaps are relative to the normals of the low-poly mesh while object space normalmaps flat-out override them. The catch is that every software uses different axes for forward, upward… like in Blender +Z is up, -Y is forward; in Unreal +Z is up, +X is forward, in Unity Y is up… so the channels need to be swizzled to match the axes of the target application.