课题名称:Solar System太阳系 学生姓名:曾睿 学生学号:0643111150
void glPushMatrix(); void glPopMatrix();
所有几何投影变换都是矩阵相乘的结果。这两个重要函数保存一个初始坐标点.
释放缓存:
不考虑信息缓存区是否放满,强制主机把命令传输出去。在高档体系结构中,每种操作是由图形硬件的不同部分分别执行的,CPU负责控制,这样才可以保证计算机资源的充分利用,提高作图质量和作图速度。OpenGL中提供了解决这个问题的操作。 glFlush();
建立窗口:
glutInitWindowSize(WIN_WIDTH, WIN_HEIGHT); // 初始化窗口大小glutInitWindowPosition(30,30); // 初始化窗口位置glutCreateWindow(WIN_TITLE); // 建立窗口
七、源代码: loadTexture.h
#ifndef LOADTEXTURE #define LOADTEXTURE
// 纹理图像结构 typedef struct { int imgWidth; int imgHeight; unsigned char byteCount; alpha通道的24位图 unsigned char *data;
// 纹理宽度
// 纹理高度
// 每个象素对应的字节数,3:24位图,4:带// 纹理数据
-12-
课题名称:Solar System太阳系 学生姓名:曾睿 学生学号:0643111150
}TEXTUREIMAGE;
// BMP文件头 #pragma pack(2) typedef struct { unsigned short bfType; // 文件类型 unsigned long bfSize; // 文件大小 unsigned short bfReserved1; // 保留位 unsigned short bfReserved2; // 保留位 unsigned long bfOffBits; // 数据偏移位置 }BMPFILEHEADER; #pragma pack()
// BMP信息头 typedef struct { unsigned long biSize; // 此结构大小 long biWidth; // 图像宽度 long biHeight; // 图像高度 unsigned short biPlanes; // 调色板数量 unsigned short biBitCount; // 每个象素对应的位数,24:24位图,32:带alpha通道的24位图 unsigned long biCompression; // 压缩 unsigned long biSizeImage; // 图像大小 long biXPelsPerMeter;// 横向分辨率 long biYPelsPerMeter;// 纵向分辨率 unsigned long biClrUsed; // 颜色使用数 unsigned long biClrImportant; // 重要颜色数 }BMPINFOHEADER;
//载入BMP位图文件
void LoadBmp(char *filename, TEXTUREIMAGE *textureImg);
//生成纹理
void MakeTexture(TEXTUREIMAGE textureImg, GLuint * texName);
#endif
loadTexture.cpp
-13-
课题名称:Solar System太阳系 学生姓名:曾睿 学生学号:0643111150
#include
void LoadBmp(char *filename, TEXTUREIMAGE *textureImg) // 载入图片 {
int i, j; FILE *file; BMPFILEHEADER bmpFile; BMPINFOHEADER bmpInfo; int pixel_size; // 初始化纹理数据 textureImg->imgWidth = 0; textureImg->imgHeight = 0; if (textureImg->data != NULL) { delete []textureImg->data; } // 打开文件 file = fopen(filename, \ if (file == NULL) { return; } // 获取文件头 rewind(file); fread(&bmpFile, sizeof(BMPFILEHEADER), 1, file); fread(&bmpInfo, sizeof(BMPINFOHEADER), 1, file); // 验证文件类型 if (bmpFile.bfType != 0x4D42) { return; } // 获取图像色彩数 pixel_size = bmpInfo.biBitCount >> 3;
-14-
课题名称:Solar System太阳系 学生姓名:曾睿 学生学号:0643111150
// 读取文件数据 textureImg->data = new unsigned char[bmpInfo.biWidth * bmpInfo.biHeight * pixel_size]; for(i = 0 ; i < bmpInfo.biHeight; i++) { fseek(file, bmpFile.bfOffBits + (bmpInfo.biHeight - i - 1) * bmpInfo.biWidth * pixel_size, SEEK_SET); for (j = 0; j < bmpInfo.biWidth; j++) { // 红色分量 fread(textureImg->data + (i * bmpInfo.biWidth + j) * pixel_size + 2, sizeof(unsigned char), 1, file); // 绿色分量 fread(textureImg->data + (i * bmpInfo.biWidth + j) * pixel_size + 1, sizeof(unsigned char), 1, file); // 蓝色分量 fread(textureImg->data + (i * bmpInfo.biWidth + j) * pixel_size + 0, sizeof(unsigned char), 1, file); // Alpha分量 if (pixel_size == 4) { fread(textureImg->data + (i * bmpInfo.biWidth + j) * pixel_size + 3, sizeof(unsigned char), 1, file); } } } // 记录图像相关参数 textureImg->imgWidth = bmpInfo.biWidth; textureImg->imgHeight = bmpInfo.biHeight; textureImg->byteCount = pixel_size; fclose(file); }
void MakeTexture(TEXTUREIMAGE textureImg, GLuint * texName) //转换为纹理 {
glPixelStorei(GL_UNPACK_ALIGNMENT, 1); glGenTextures(1,texName);
-15-

