openGL學習筆記6 bmp 2D紋理貼圖

#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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章