Hi, I'm trying to create a normal mapping tool that creates normalmaps from heightmaps. I've got it kind of working but there is a lot of random color and not really very smooth transitions between some pixels, there are sometimes 'criss cross' style patterns and I really have no idea whats going on.
Take a look here as gamedev.net won't allow my to img src a bmp for some reason, sorry.
http://www.flickr.com/photos/56802324@N04/8400199937/
My assumption is this: I read a 1 byte value from a height map - this can contain a value from 0 to 256. Using some samples from surrounding pixels I can try and create a 'vector', normalize this and then use the values as the RGB values of a normal map.
Here is the meat of the code:
void CreateNormalMap(const char* inFilename,const char* outFilename)
{
unsigned int width,height,bytes;
//read original bmp info
unsigned char* img = OpenImage(inFilename,width,height,bytes);
//create normal map data
//set 'scales', using a 1.0f scale for y right now,
//x and z are determined by the width/height of the bmp file
float heightScale = 1.0f;
float xScale = 1.0f/width;
float zScale = 1.0f/height;
unsigned char* normalMap = new unsigned char[width * height * 3];
for( int z = 0; z < height; z++){
for(int x = 0; x < width; x++){
int index = z * width + x;
//take sample from current pixel
float const y0 = img[index];
//take samples from surrounding pixels
float const Az = ( x + 1 < width ) ? ( img[index + 1] ) : y0;
float const Bz = ( z + 1 < height ) ? ( img[index + width]) : y0;
float const Cz = ( x - 1 >= 0 ) ? ( img[index - 1] ) : y0;
float const Dz = ( z - 1 >= 0 ) ? ( img[index - width] ) : y0;
//construct a vector then normalize it
glm::vec3 normVec = glm::vec3(Cz - Az,heightScale,Dz - Bz);
normVec = glm::normalize(normVec);
//write the values to the normal map, they are currently between 0.0 and 1.0f
//so scale them using 256 to map to rgb value
normalMap[index * 3 ] = normVec.x * xScale * 256;
normalMap[index * 3 + 1] = normVec.y * yScale * 256;
normalMap[index * 3 + 2] = normVec.z * zScale * 256;
}
}
}