换到Glut上面,原先找到的cocoa那层都得重新写过。考虑到将来的移植问题,读取BMP的部分也就没用glaux(这玩意儿只有windows下能用……)和mac的库,自己弄了个读bmp的函数。写好之后测了半天,图片明明读进来了就是不显示纹理。折腾了一个下午,最后发现是个莫名其妙的问题导致bmp的头部读取不正常。
typedef struct tagBITMAPFILEHEADER
{
short int bfType; //specifies the file type
int bfSize; //specifies the size in bytes of the bitmap file
short int bfReserved1; //reserved; must be 0
short int bfReserved2; //reserved; must be 0
int bfOffBits; //species the offset in bytes from the bitmapfileheader to the bitmap bits
}BITMAPFILEHEADER;
很清楚的结构,short int长度2,int长度4,想当然的sizeof(BITMAPFILEHEADER)=14,试了一下,居然是16……搜了搜,发现这涉及结构体成员的对齐方式,把这段定义放进#pragma pack(1)和#pargma pack()之间即可。
原因是#pragma pack(n)指定了成员的对齐方式。对齐的时候,假设某个成员长度len,则取x=min(len, n),这个成员的起始地址就是x的整数倍。
据说intel和m$的面试题也考到这点,当然更深入。http://www.sf.org.cn/Article/base/200509/260.html