在opengl贴吧中被人翻上来一个以前求助贴:
//照着NeHe的教程 lesson6,弄了个有纹理的四面体
#include <GL\glut.h>
//用 auxDIBImageLoad 来加载纹理
#include <GL\GLAUX.H>
#pragma comment(lib,"GLAUX.lib")
#include<stdio.h>
GLuint texture[1];
AUX_RGBImageRec *LoadBMP(char *Filename) // 读取一个BMP图像
{
FILE *File=NULL; // 文件句柄
if (!Filename) // 确保提供了文件名
{
return NULL; // If Not Return NULL
}
File=fopen(Filename,"r"); // 检查文件是否存在
if (File) // 文件是否存在?
{
fclose(File); // Close The Handle
WCHAR wstrFilename[MAX_PATH]={0};
MultiByteToWideChar(CP_ACP, 0, Filename, -1, wstrFilename, sizeof(wstrFilename));
return auxDIBImageLoad(wstrFilename); // 加载位图并返回指针
}
return NULL; // 如果加载失败, 则返回 NULL
}
int LoadGLTextures() //载入位图 并生成纹理
{
int Status=FALSE;
AUX_RGBImageRec *TextureImage[1];
memset(TextureImage,0,sizeof(void *)*1);
if (TextureImage[0]=LoadBMP("Data/NeHe.bmp"))
{
Status=TRUE;
glGenTextures(1, &texture[0]); // 创建纹理
// 使用来自位图数据生成 的典型纹理
glBindTexture(GL_TEXTURE_2D, texture[0]);
glTexImage2D(GL_TEXTURE_2D, 0, 3, TextureImage[0]->sizeX, TextureImage[0]->sizeY, 0, GL_RGB, GL_UNSIGNED_BYTE, TextureImage[0]->data);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR); // 线形滤波
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);
}// 线形滤波
if (TextureImage[0]) // 纹理是否存在
{
if (TextureImage[0]->data) // 纹理图像是否存在
{
free(TextureImage[0]->data); // 释放纹理图像占用的内存
}
free(TextureImage[0]); // 释放图像结构
}
return Status; // 返回 成功状态
}
void init(void)//初始化
{
glEnable(GL_TEXTURE_2D);
glClearColor(0.0,0.0,0.0,0.0);
glMatrixMode(GL_PROJECTION);
glOrtho(0.0,200.0,200.0,200.0,0.0,200.0);
glEnable(GL_DEPTH_TEST);
glClearDepth(1.0f);
LoadGLTextures() ;
}
float angel2=0.0;//旋转角度
void display(GLvoid){//显示
glClear(GL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
glTranslatef(0.5,0.0,0.0);
glRotatef(angel2,1.0,1.0,1.0);//按角度旋转
glBindTexture(GL_TEXTURE_2D, texture[0]);
glBegin(GL_QUADS);
glTexCoord2f(0.0f, 0.0f); glVertex3f(-0.2f, -0.2f, 0.2f); // 纹理和四边形的左下
glTexCoord2f(1.0f, 0.0f); glVertex3f( 0.2f, -0.2f, 0.2f); // 纹理和四边形的右下
glTexCoord2f(1.0f, 1.0f); glVertex3f( 0.2f, 0.2f, 0.2f); // 纹理和四边形的右上
glTexCoord2f(0.0f, 1.0f); glVertex3f(-0.2f, 0.2f, 0.2f); // 纹理和四边形的左上
// 后面
glTexCoord2f(1.0f, 0.0f); glVertex3f(-0.2f, -0.2f, -0.2f); // 纹理和四边形的右下
glTexCoord2f(1.0f, 1.0f); glVertex3f(-0.2f, 0.2f, -0.2f); // 纹理和四边形的右上
glTexCoord2f(0.0f, 1.0f); glVertex3f( 0.2f, 0.2f, -0.2f); // 纹理和四边形的左上
glTexCoord2f(0.0f, 0.0f); glVertex3f( 0.2f, -0.2f, -0.2f); // 纹理和四边形的左下
// 顶面
glTexCoord2f(0.0f, 1.0f); glVertex3f(-0.2f, 0.2f, -0.2f); // 纹理和四边形的左上
glTexCoord2f(0.0f, 0.0f); glVertex3f(-0.2f, 0.2f, 0.2f); // 纹理和四边形的左下
glTexCoord2f(1.0f, 0.0f); glVertex3f( 0.2f, 0.2f, 0.2f); // 纹理和四边形的右下
glTexCoord2f(1.0f, 1.0f); glVertex3f( 0.2f, 0.2f, -0.2f); // 纹理和四边形的右上
// 底面
glTexCoord2f(1.0f, 1.0f); glVertex3f(-0.2f, -0.2f, -0.2f); // 纹理和四边形的右上
glTexCoord2f(0.0f, 1.0f); glVertex3f( 0.2f, -0.2f, -0.2f); // 纹理和四边形的左上
glTexCoord2f(0.0f, 0.0f); glVertex3f( 0.2f, -0.2f, 0.2f); // 纹理和四边形的左下
glTexCoord2f(1.0f, 0.0f); glVertex3f(-0.2f, -0.2f, 0.2f); // 纹理和四边形的右下
// 右面
glTexCoord2f(1.0f, 0.0f); glVertex3f( 0.2f, -0.2f, -0.2f); // 纹理和四边形的右下
glTexCoord2f(1.0f, 1.0f); glVertex3f( 0.2f, 0.2f, -0.2f); // 纹理和四边形的右上
glTexCoord2f(0.0f, 1.0f); glVertex3f( 0.2f, 0.2f, 0.2f); // 纹理和四边形的左上
glTexCoord2f(0.0f, 0.0f); glVertex3f( 0.2f, -0.2f, 0.2f); // 纹理和四边形的左下
// 左面
glTexCoord2f(0.0f, 0.0f); glVertex3f(-0.2f, -0.2f, -0.2f); // 纹理和四边形的左下
glTexCoord2f(1.0f, 0.0f); glVertex3f(-0.2f, -0.2f, 0.2f); // 纹理和四边形的右下
glTexCoord2f(1.0f, 1.0f); glVertex3f(-0.2f, 0.2f, 0.2f); // 纹理和四边形的右上
glTexCoord2f(0.0f, 1.0f); glVertex3f(-0.2f, 0.2f, -0.2f); // 纹理和四边形的左上
glEnd();
glFlush();
angel2+= 0.015;//旋转角度步进
}
void main(int argc, char ** argv)
{
LoadGLTextures() ;
glutInitWindowPosition(100,100);
glutInitWindowSize(500,500);
glutCreateWindow("有纹理的四面体");
init();
LoadGLTextures() ;
glutDisplayFunc(display);
glutIdleFunc(display);
glutMainLoop();
}
运行图:
记得以前搞过几个用opengl显示3DS模型的,下面几章来整理一下,回头再来研究3D重建 。