#include<Windows.h>
#include<gl/glut.h>
#pragma comment(linker, "/subsystem:\"windows\" /entry:\"mainCRTStartup\"")
#define FileName "test.bmp"
static GLint imagewidth;
static GLint imageheight;
static GLint pixellength;
static GLubyte* pixeldata;
static GLuint texname[1];
#include<stdio.h>
#include<stdlib.h>
void init()
{
glClearColor(0.0,0.0,0.0,0.0);
glShadeModel(GL_SMOOTH);
//打開文件
FILE* pfile=fopen("test.bmp","rb");
if(pfile == 0) exit(0);
//讀取圖像大小
fseek(pfile,0x0012,SEEK_SET);
fread(&imagewidth,4,1,pfile);//讀取圖像的寬
fread(&imageheight,4,1,pfile);//讀取圖像的高
//計算像素數據長度
pixellength=imagewidth*3;
while(pixellength%4 != 0)pixellength++;
pixellength *= imageheight; //補全寬*3爲4的倍數後乘以高,即爲像素數據的大小
//讀取像素數據
pixeldata = (GLubyte*)malloc(pixellength);//開闢內存空間
if(pixeldata == 0) exit(0);
rewind(pfile);//重置文件指針
fseek(pfile,54,SEEK_SET);//偏移54位
fread(pixeldata,pixellength,1,pfile);
//關閉文件
fclose(pfile);
glGenTextures(1,texname);
glBindTexture(GL_TEXTURE_2D,*texname);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_S,GL_CLAMP);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_T,GL_CLAMP);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_NEAREST);
glTexImage2D(GL_TEXTURE_2D,0,3,imagewidth,imageheight,0,GL_BGR_EXT,GL_UNSIGNED_BYTE,pixeldata);
glEnable(GL_TEXTURE_2D);
}
void display(void)
{
glClear(GL_COLOR_BUFFER_BIT);
glBegin(GL_QUADS);
glTexCoord2f( 0.0, 0.0 ); glVertex3f( -1.0, -1.0, 0.0 );
glTexCoord2f( 1.0, 0.0 ); glVertex3f( 1.0, -1.0, 0.0 );
glTexCoord2f( 1.0, 1.0 ); glVertex3f( 1.0, 1.0, 0.0 );
glTexCoord2f( 0.0, 1.0 ); glVertex3f( -1.0, 1.0, 0.0 );
glEnd();
glFlush();
}
void reshape(int w,int h)
{
glViewport(0,0,imagewidth,imageheight);//以左下角爲原點選擇繪圖區域
glMatrixMode(GL_PROJECTION);//指定當前操作矩陣爲投影矩陣
glLoadIdentity();
//glFrustum(-1.0,1.0,-1.0,1.0,1.5,20.0);//把當前矩陣轉變成透視矩陣
//gluPerspective(30,1.0,1.5,50);
glMatrixMode(GL_MODELVIEW);//對模型視圖矩陣進行操作
}
int main(int argc,char* argv[])
{
glutInit(&argc,argv);
glutInitDisplayMode(GLUT_SINGLE|GLUT_RGBA);
glutInitWindowPosition(100,100);
glutInitWindowSize(510,510);
glutCreateWindow(FileName);
glutDisplayFunc(display);
glutReshapeFunc(reshape);
init();
glutMainLoop();
free(pixeldata);
return 0;
}
bmp文件格式
文件指針偏移18 讀取寬度再讀高度
文件指針偏移54 讀取像素數據
bmp 像素數據大小計算 寬*3 補全爲4的倍數之後*高度 如510*510 的bmp位圖 用(510*3+2)*510
紋理貼圖步驟
1、glGenTextures(1,texname); //生成紋理索引
2 、glBindTexture(GL_TEXTURE_2D,*texname); //綁定紋理對象
3、設置參數
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_S,GL_CLAMP);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_T,GL_CLAMP);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_NEAREST);
4、glTexImage2D(GL_TEXTURE_2D,0,3,imagewidth,imageheight,0,GL_BGR_EXT,GL_UNSIGNED_BYTE,pixeldata); //創建紋理對象
注意GL_BGR_EXT 原因是bmp圖像的rgb排列方式爲bgr