okay so, this will teach you to bake ambient occlusion, and turn it into a color map, and a normal map. (this tutorial assumes you have slight knowledge of modeling, the UV editor, and sculpt mode)
also, ignore my spelling mistakes please
Step one, model the low poly, and unwrap it with the UV editor, i wont go into detail about modeling or unwrapping.
Step two, duplicate that mesh, go into sculpt mode and add your details, when I finished, this is what I had:
here’s the low poly next to the high holy:
Now add a new image to bake the ambient occlusion onto
then start baking…
then when it finishes, save the texture it makes
here’s the texture on the low and high poly meshes:
Now, take that ambient occlusion and convert it to a normal map, you can use the GIMP, or Photoshop, or CrazyBump like I used, CrazyBump is a program just for generating normal maps from photographs or other pictures.
this is what CrazyBump generated next to the ambient occlusion
Next step, is to paint a color map, I used the baked ambient occlusion as a base, then pained over it with my tablet and photoshop, this is what the color map looks like applied to the low poly head:
Now, add a material to the head, and in the texture slots, make sure the color map is first, then below it the normal map, remember to set UV for both of em, and put Nor and Col for the appropriate ones.
Now that the textures are done, add an empty, and give it an always sensor, attached to this script:
import GameLogic as g
objlist = g.getCurrentScene().getObjectList()
g.setLogicTicRate(60.0)
-------------------------------------
ShaderObjects = [ objlist[‘OBCube’] ]
MaterialIndexList = [0,1]
GlobalAmbient = [0.39,0.35,0.32,1]
AmbF = 0.5
-------------------------------------
VertexShader = “”"
uniform mat4 mvi;
vec4 Tangent;
varying vec4 vcol;
varying vec3 lvec,vvec;
vec3 TBN(in vec3 by)
{
vec3 tangent = (Tangent.xyz);
vec3 binormal = cross(gl_Normal, Tangent.xyz)*Tangent.w;
vec3 normal = gl_Normal;
vec3 tvec;
tvec.x = dot(tangent, by);
tvec.y = dot(binormal, by);
tvec.z = dot(normal, by);
return tvec;
}
void main() {
gl_Position = ftransform();
// texcoord now (vec4())
Tangent = gl_MultiTexCoord1;
vec4 light0 = (mvi*gl_LightSource[0].position)-gl_Vertex;
vec4 view = mvi[3]-gl_Vertex;
lvec = TBN(light0.xyz);
vvec = TBN(view.xyz);
gl_TexCoord[0] = gl_MultiTexCoord0;
vcol =gl_Color;
}
“”"
FragmentShader = “”"
varying vec4 vcol;
varying vec3 lvec,vvec,hvec;
uniform sampler2D color;
uniform sampler2D bump;
void main() {
vec4 diffuse_color = vcol*gl_LightSource[0].diffuse;
vec4 specular_color = gl_FrontMaterial.specular;
vec4 colormap = texture2D(color, gl_TexCoord[0].st);
vec3 lv = normalize(lvec);
vec3 vv = normalize(vvec);
vec3 nv = normalize(2.0*texture2D(bump, gl_TexCoord[0].st).xyz-1.0);
float diff = max(dot(lv, nv), 0.0);
float spec = pow(max(dot(reflect(-vv, nv), lv),0.0), gl_FrontMaterial.shininess);
vec4 diff_pass = colormap*(diff*diffuse_color);
vec4 spec_pass = spec*specular_color;
gl_FragColor = vec4(0.1,0.1,0.1,1.0)+diff_pass+spec_pass;
}
“”"
def MainLoop ():
# for each object
for obj in ShaderObjects:
mesh_index = 0
mesh = obj.getMesh(mesh_index)
while mesh != None:
for mat in mesh.materials:
# regular TexFace materials do NOT have this function
if not hasattr(mat, "getMaterialIndex"):
return
mat_index = mat.getMaterialIndex()
# find an index
found = 0
for i in range(len(MaterialIndexList)):
if mat_index == MaterialIndexList[i]:
found=1
break
if not found: continue
shader = mat.getShader()
if shader != None:
if not shader.isValid():
shader.setSource(VertexShader, FragmentShader,1)
# shader.setAttrib(g.SHD_TANGENT)
shader.setUniformDef('mvi', g.MODELVIEWMATRIX_INVERSE)
shader.setSampler('color', 0)
shader.setSampler('bump', 1)
mesh_index += 1
mesh = obj.getMesh(mesh_index)
-------------------------------------
MainLoop()
-------------------------------------
change “OBCube” to the name of the object that should be normal mapped, also make sure you have “use Blender Materials” enabled.
this is what I came up with, normal mapped is on the left, and not normal mapped is on the right:
Sure its not that great cuz I did it quickly, maybe you can do something better
![:smiley: :smiley:](https://blenderartists.org/images/emoji/twitter/smiley.png?v=12)
So thats pretty much it… have fun normal mapping
keep on Blendering too people!