用OpenGL快速给图形添加纹理含圆柱圆锥
来源:互联网 发布:www.csdn.net.sql 编辑:程序博客网 时间:2024/04/29 07:47
这里讨论的是二维纹理
1.图取图像数据
void readimage(char* filename, BYTE* imagedata)//所读图片均为24位bmp,且宽度补齐至四字节边界{BITMAPFILEHEADER bf; //文件头BITMAPINFOHEADER bi; //信息头int m_ImageWidth; //图象宽度int m_ImageHeight; //图象高度FILE *fp1; //文件指针,fp1为源文件//打开文件,到文件指针if ((fp1 = fopen(filename, "rb")) == NULL){MessageBox(NULL, "文件打开错误", "warning", MB_OK);}fread((LPSTR)&bf, sizeof(BITMAPFILEHEADER), 1, fp1); //读取文件头,读取以后文件指针在文件头末尾(即信息头)fread((LPSTR)&bi, sizeof(BITMAPINFOHEADER), 1, fp1); //读取信息头m_ImageWidth = bi.biWidth; //给图象宽度赋值m_ImageHeight = bi.biHeight; //给图象高度赋值fread(imagedata, m_ImageHeight*m_ImageWidth * 3, 1, fp1); //读取图象数据fclose(fp1);}
注意:读进来的图像为BGR,要调整为RGB
void adjustimage(BYTE* imagedata, int w, int h){BYTE temp;for (int i = 0; i<w*h; i++){<pre name="code" class="cpp">glEnable(GL_TEXTURE_2D);
temp = imagedata[i * 3];imagedata[i * 3] = imagedata[i * 3 + 2];imagedata[i * 3 + 2] = temp;}}2.设置纹理(因为一般要用到的纹理比较多,先将所有图片读入,要用到那张时候就使用glBindTexture函数来指定当前所使用的纹理对象)
注意:图像的像素要与数组对应,下面的是256*256
//------------------------设置纹理----------------------------------void loadtexture(){ glGenTextures(2, &texName);//2表示有两个纹理glBindTexture(GL_TEXTURE_2D, texName);{BYTE imagemoon[256][256][3];//墙壁2的纹理readimage("D:\\wall2.bmp", &imagemoon[0][0][0]);adjustimage(&imagemoon[0][0][0], 256, 256);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, GL_RGB, 256, 256, 0, GL_RGB, GL_UNSIGNED_BYTE, imagemoon);}{BYTE imagesky[256][256][3];readimage("D:\\wall1.bmp", &imagesky[0][0][0]);//墙壁1的纹理adjustimage(&imagesky[0][0][0], 256, 256);glBindTexture(GL_TEXTURE_2D, texName + 1);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, GL_RGB, 256, 256, 0, GL_RGB, GL_UNSIGNED_BYTE, imagesky);}}
3.启用纹理
glEnable(GL_TEXTURE_2D);
例子:坐标要对应,纹理用单位表示,(0.0,0.0)表示左下角(1.0,1.0)表示右上角
void display(void){glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);//printf("At:%.2f %.2f %.2f\n",r*cos(c*du),h,r*sin(c*du)); //这就是视点的坐标glLoadIdentity();gluLookAt(r*cos(c*du), h, r*sin(c*du), 0, 0, 0, 0, 1, 0); //从视点看远点,y轴方向(0,1,0)是上方向glColor3f(1.0f, 0.0f, 0.0f);glEnable(GL_TEXTURE_2D);glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_DECAL);//地面glPushMatrix();glBindTexture(GL_TEXTURE_2D, texName + 2);glColor3f(0.0, 1.0, 1.0);glBegin(GL_QUADS);glTexCoord2f(0.0, 0.0); glVertex3f(5.0f,-2.0f,3.0f);glTexCoord2f(1.0, 0.0); glVertex3f(-5.0f, -2.0f, 3.0f);glTexCoord2f(1.0, 1.0); glVertex3f(-5.0f, -2.0f, -3.0f);glTexCoord2f(0.0, 1.0); glVertex3f(5.0f, -2.0f, -3.0f);glEnd();//左墙glPushMatrix();glBindTexture(GL_TEXTURE_2D, texName + 1);glBegin(GL_POLYGON);glTexCoord2f(0.0, 0.0); glVertex3f(-2.0, 0.0, 1.5);glTexCoord2f(0.0, 0.66); glVertex3f(-2.0, 2.0, 1.5);glTexCoord2f(0.5, 1.0); glVertex3f(-2.0, 3.0, 0.0);glTexCoord2f(1.0, 0.66); glVertex3f(-2.0, 2.0, -1.5);glTexCoord2f(1.0, 0.0); glVertex3f(-2.0, 0.0, -1.5);glEnd();glPopMatrix();glFlush();glutSwapBuffers();glDisable(GL_TEXTURE_2D);}
5.对于圆柱和圆锥
将圆柱和圆锥看做是由很多线组成的,使用三角函数和一个循环就可以画出
//圆柱glTranslatef(-3.0, -2.0, 2.0);glPushMatrix();glBindTexture(GL_TEXTURE_2D, texName ); glBegin( GL_QUAD_STRIP); double t = 0.0;double dt = 2*PI/nslice; for (int j = 0; j <= nslice; ++j) { glTexCoord2f( t/(2*PI), 1.0); glVertex3f( cos( t), 2.0, -sin( t)); glTexCoord2f( t/(2*PI), 0.0); glVertex3f( cos( t), 0.0, -sin( t)); t = t + dt; } glEnd();glPopMatrix();//圆锥glPushMatrix();glBindTexture(GL_TEXTURE_2D, texName + 4 );glBegin( GL_QUAD_STRIP); double tt = 0.0;double dtt = 2*PI/nslice; for (int j = 0; j <= nslice; ++j) { glTexCoord2f( tt/(2*PI), 1.0); glVertex3f( 0.0, 2.0, 0.0); glTexCoord2f( tt/(2*PI), 0.0); glVertex3f( cos( tt), 0.0, -sin( tt)); tt = tt + dtt; } glEnd();glPopMatrix();
0 0
- 用OpenGL快速给图形添加纹理含圆柱圆锥
- OpenGL图形函数(正方体、圆柱、圆锥)
- OpenGL之路(四)自制图形函数(正方体、圆柱、圆锥)
- qt opengl lesson6 给立体图形绘制纹理
- 圆锥与圆柱
- opengl中添加纹理
- Opengl 添加纹理
- Android OpenGL添加纹理
- 给立方体添加纹理
- OpenGL基础图形编程 - 纹理映射
- OpenGL基础图形编程 - 纹理映射
- OpenGL基础图形编程--纹理映射
- 有关球 圆柱 圆锥 的计算
- 关于圆、圆柱、圆锥的计算
- 给一个正方形添加纹理
- NeHe_OpenGL_Qt4 圆柱纹理映射
- WPS文字给字体添加纹理效果快速改变输入文字的颜色
- OpenGL 入门基础教程 —— 添加纹理
- OpenGL学习入门之VS2010环境配置
- Ubuntu常用命令汇总
- Nginx配置的问题
- Nginx配置的问题
- Ubuntu常用命令汇总
- 用OpenGL快速给图形添加纹理含圆柱圆锥
- 解决Apache/PHP无法启动的问题
- static作用
- ugg australia pas cher et aussi excessive dont
- apache虽然能运行,但是看见error.log中有httpd.exe: Could not reliably determine the server's fully qualified doma
- 更改Ubuntu用户名带来的一次惊心动魄的经历
- chaussures ugg apprécier cette hiver.
- 从视图索引说Notes数据库
- SQLServer 存储过程处理超长字符串问题