资源简介
opengl实现纹理贴图,以地球为例子,但是实现得有点粗糙,地球上出现了一条裂缝
代码片段和文件信息
# include
# include
# include
# include
# include
#define Pi 3.141592653
#define X .525731112119133606
#define Z .850650808352039932
//二十面体的十二个顶点坐标
static GLfloat vdata[12][3] = {
{-X 0.0 Z} {X 0.0 Z} {-X 0.0 -Z} {X 0.0 -Z}
{0.0 Z X} {0.0 Z -X} {0.0 -Z X} {0.0 -Z -X}
{Z X 0.0} {-Z X 0.0} {Z -X 0.0} {-Z -X 0.0}
};
//二十个三角形面的顶点索引
static GLuint tindices[20][3] = {
{1 4 0} {4 9 0} {4 5 9} {8 5 4} {1 8 4}
{1 10 8} {10 3 8} {8 3 5} {3 2 5} {3 7 2}
{3 10 7} {10 6 7} {6 11 7} {6 0 11} {6 1 0}
{10 1 6} {11 0 9} {2 11 9} {5 2 9} {11 2 7}
};
GLint ImageWidth ImageHeight PixelLength;
GLubyte *pixeldata; //存储图像信息
char name[20] = “earth.bmp“;
GLuint texname;
GLint px py;
GLfloat rx ry;
bool rotate;
GLfloat rot[3] depth;
GLsizei width height;
//记录旋转矩阵
GLdouble current_rotate_matrix[16] = {
1.0 0.0 0.0 0.0
0.0 1.0 0.0 0.0
0.0 0.0 1.0 0.0
0.0 0.0 0.0 1.0
};
void loadtexture(char *filename) //读入图像文件
{
FILE *pFile;
pFile = fopen(filename “r“);
if(pFile == 0)
{
printf(“picture open error\n“);
exit(0);
}
fseek(pFile 0x0012 SEEK_SET); //从第18个字节开始的8个字节存储图像的宽和高!!!!
fread(&ImageWidth sizeof(ImageWidth) 1 pFile);
fread(&ImageHeight sizeof(ImageHeight) 1 pFile);
// 计算像素数据长度
PixelLength = ImageWidth * 3; //一个像素有R、G、B成分,所以乘以3
while( PixelLength % 4 != 0 ) //四字节对齐
++PixelLength;
PixelLength *= ImageHeight;
// 读取像素数据
pixeldata = (GLubyte*)malloc(PixelLength);
if( pixeldata == 0 )
exit(0);
fseek(pFile 54 SEEK_SET); //从第54个字节往后是图像的真正内容
fread(pixeldata PixelLength 1 pFile);
// 关闭文件
fclose(pFile);
}
void init()
{
glClearColor(0.0 0.0 0.0 0.0);
glShadeModel(GL_FLAT);
glEnable(GL_DEPTH_TEST);
loadtexture(name); //载入纹理图像
glPixelStorei(GL_UNPACK_ALIGNMENT 4);
glGenTextures(1 &texname);
glBindTexture(GL_TEXTURE_2D texname);
glTexParameteri(GL_TEXTURE_2D GL_TEXTURE_WRAP_S GL_REPEAT);
glTexParameteri(GL_TEXTURE_2D GL_TEXTURE_WRAP_T GL_REPEAT);
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);
}
void reshape(int w int h)
{
width = w;
height = h;
glViewport(0 0 (GLsizei)w (GLsizei)h);
glMatrixMode(GL_PROJECTION);
glLoadIdentity();
gluPerspective(60.0 (GLfloat)w/(GLfloat)h 0.1 100.0);
glMatrixMode(GL_MODELVIEW);
glLoadIdentity();
}
void normalize(float v[]) //把一个向量规范化
{
GLfloat d = sqrt(v[0]*v[0] + v[1]*v[1] + v[2]*v[2]);
if(d == 0.0)
{
printf(“zero length vector\n“);
return;
}
v[0] /= d;
v[1] /= d;
v[2] /= d;
}
void
- 上一篇:简单通讯录
- 下一篇:VC6.0完全卸载工具.exe
相关资源
- opengl绘制简单小动物
- kinect+openGL+openNI+opencv实现三维重建
- openGL和C++实现光线跟踪作业
- Timer时钟.zip
- ue4蓝图c++动态改变staticmeshactor材质动
- OpenGL3D
- Dialog下创建 MFC OpenGL子窗口
- 仿雷电游戏OpenGL源码C++版
- DDA画线算法
- 模拟卫星旋转和地球自转
- OpenGL纹理贴图源程序.rar
- 计算机图形学实验二 opengl
- OpenGL载入3ds模型并在MFC视图窗口显示
- 计算机图形学OpenGL画机器人
- openGL通过点线方式画出立方体并移动
- OPENGL 画颜色渐变六角星+旋转
- opengl头文件
- opengl五角星绘制
- OpenGL火焰
- OpenGL纹理茶壶
- OpenGL实现的三维桌球游戏模拟源代码
- openGL绘制的一个移动的2D小车,C++编写
- OPENGL分形模拟山脉
- kinect+opengl 生成并显示点云
- 基于MFC和OPENGL的五轴G代码仿真
- 地球仪纹理型纹理贴图 C++代码
- 雪花——OpenGL
- 编写 1 个程序绘制这些控制点生成的
- vc++ 和 openGL 做的 3D水波模拟 非常炫
- 基于openGl的画直线和三角形光栅化源
评论
共有 条评论