计算机图形学 实验6 《纹理映射》
计算机图形学 实验6 《纹理映射》
一、实验目的
学习真实感图形绘制技术。
二、实验内容
1、读取或生成纹理图像数据;
2、将纹理图像映射到物体表面。
三、实验方法
要使用纹理映射,我们必须做以下三件事情:在OpenGL中装入纹理,为顶点提供纹理坐标(为了把纹理映射到顶点),用纹理坐标在纹理上执行一个采样操作,得到一个像素颜色。OpenGL支持 1D, 2D, 3D, cube等等多种纹理,使用glEnable(GL_TEXTURE_2D)
开启2D纹理功能,使用glDisable(GL_TEXTURE_2D)
关闭纹理,默认情况下纹理是关闭的。
四、实验步骤
1、准备纹理,这里准备的是棋盘纹理,结果存储在纹理数组中;
2、确定纹理映射的对象,这里选取一个抛物面;
3、将制作好的纹理通过glTexImage2D
等等函数映射到指定对象(抛物面)上。
五、实验结果
实验输出图(以抛物面为基础绘制,上图橙色部分是后期画上去的边界)
六、实验结论
使用函数glGenTextures(N, &textureID)
来分配N个纹理编号,使用glTexParameteri
来设置常用的4个纹理参数,这些参数包括了当前纹理图像大小/小于模型目标时扩展纹理的处理方式。
关键代码:
#define checkImageWidth 64
#define checkImageHeight 64GLuint m_texName[2]; //纹理名称
GLubyte checkImage[checkImageHeight][checkImageWidth][3];
GLubyte image1D[checkImageWidth][3];GLfloat diffuseMaterial[4] = { 0.5, 0.5, 0.5, 1.0 };double parabolicSurf[36][10][3]; //用于绘制抛物面结构:36==>圆周36等分 10==>半径方向9等分 3==>坐标x、y、z
double vertexNormal[36][10][3]; //法向量:消除马赫带// 在相应的display函数当中调用这个函数
void DrawTextureGraph()
{glGenTextures(2, m_texName);//向系统申请2个整数glBindTexture(GL_TEXTURE_2D, m_texName[0]);//用这个整数表示某个纹理图片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_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);//设置纹理参数,按照什么样的方式去映射//glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR);//glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR);/*指定纹理图片位置(在内存中存放的位置)*/glTexImage2D(GL_TEXTURE_2D,0, //texture type,level 纹理类型:二维,纹理级别:0级(分级是为了防止放大失真)GL_RGB, //internal format 数据以RGB存储64, 64, 0, //width,height,border 宽,高,边框(0,没有边框)GL_RGB, GL_UNSIGNED_BYTE, //format,type 数据的内部存储格式checkImage); //棋盘作为纹理图像,纹理绑定//一维纹理glBindTexture(GL_TEXTURE_1D, m_texName[1]);glTexParameteri(GL_TEXTURE_1D, GL_TEXTURE_WRAP_S, GL_REPEAT);glTexParameteri(GL_TEXTURE_1D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);glTexParameteri(GL_TEXTURE_1D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);glTexImage1D(GL_TEXTURE_1D, 0, GL_RGB,64, 0, //width,borderGL_RGB, GL_UNSIGNED_BYTE,image1D);int flag = 2;if(flag==2) {glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_DECAL);glEnable(GL_TEXTURE_2D);}else if(flag==1) {glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_DECAL);//GL_MODULATE);//glTexGeni(GL_S, GL_TEXTURE_GEN_MODE, GL_OBJECT_LINEAR);//GLfloat coeff[]={1.0, 0.0, 0.0, 0.0};//glTexGenfv(GL_S, GL_OBJECT_PLANE, coeff); //自动生成一维纹理glEnable(GL_TEXTURE_1D);}else {glDisable(GL_TEXTURE_2D);glDisable(GL_TEXTURE_1D);}glBegin(GL_QUADS);//每个小块看成是四边形flag = 2;if(flag == 2) //二维纹理{// 下面的代码用于绘制抛物面,可以用其他图形的绘制代替之,部分函数(如Normal函数)的实现这里省略for(int a = 0; a < 36; a++) {for(int r = 0; r < 9; r++) {double n[3];Normal(parabolicSurf[a][r], parabolicSurf[a][r + 1], parabolicSurf[(a + 1)%36][r + 1], n);glNormal3dv(n);glTexCoord2d(parabolicSurf[a][r][0]/2.0 + 0.5, parabolicSurf[a][r][1]/2.0 + 0.5);glVertex3dv(parabolicSurf[a][r]);glTexCoord2d(parabolicSurf[a][r + 1][0]/2.0 + 0.5, parabolicSurf[a][r + 1][1]/2.0 + 0.5);glVertex3dv(parabolicSurf[a][r + 1]);glTexCoord2d(parabolicSurf[(a + 1)%36][r + 1][0]/2.0 + 0.5, parabolicSurf[(a + 1)%36][r + 1][1]/2.0 + 0.5);glVertex3dv(parabolicSurf[(a + 1)%36][r + 1]);glTexCoord2d(parabolicSurf[(a + 1)%36][r][0]/2.0 + 0.5, parabolicSurf[(a + 1)%36][r][1]/2.0 + 0.5);glVertex3dv(parabolicSurf[(a + 1)%36][r]);}}}
}
七、实验小结
使用gltextImage2D
函数根据指定的纹理参数生成一个2D纹理,第一个参数为指定的目标,可以使用GL_TEXTURE_2D
,第二个参数为“多重细节层次”,不考虑多重纹理的话设置为零,第三个参数表示RGB数据存储的格式,这里使用GL_RGB
,第四、五个参数是二维纹理像素的宽度和高度,第六个参数是纹理边框的大小,不使用纹理边框设置为零,第七个核第八个参数是数据格式和数据保存形式,第九个参数是保存了纹理图像的内参块地址。
计算机图形学 实验6 《纹理映射》相关推荐
- 计算机图形学——实验四 纹理映射实验
实验四 纹理映射实验 实验项目性质:设计性实验 所属课程名称:计算机图形学A 实验计划学时:3学时 一.实验目的和要求 掌握纹理映射的基本原理,利用VC++ OpenGL实现纹理映射技术. 二.实验原 ...
- 华北电力大学计算机图形学实验报告,华北电力大学计算机图形学实验报告分析.doc...
华北电力大学计算机图形学实验报告分析 科 技 学 院 课程设计(综合实验)报告 ( 2013 -- 2014 年度第 2 学期) 实验名称 OpenGL基本图元绘制实验 课程名称 计算机图形学 | | ...
- 计算机图形学课程设计html源码,孔令德的计算机图形学实验及课程设计(VC++版)...
[实例简介] 计算机图形学实验及课程设计,是太原工业学院孔令德教授编写的关于计算机图形学这门课程相关的18个实验及5个课程设计.案例由浅入深,具有很强的操作性和实际意义. 本资源给出实验的ppt课件以 ...
- 计算机图形学实验教程,计算机图形学实验
时间:2019-05-12 06:42:24 作者:admin 实验三 MFC画直线 最近自己在学习如何在VC 6.0 开发环境下的使用MFC AppWizard(exe)来绘画一条直线,虽然比较简单 ...
- 计算机图形学实验——三维迷宫的创建及走迷宫过程中的交互功能的实现
计算机图形学实验2 三维迷宫的创建及走迷宫过程中的交互功能的实现 OpenGL三维迷宫创建及交互 三维"图元"的绘制 迷宫结构的储存 视角转换的实现 碰撞检测 纹理贴图 小结 Op ...
- 计算机图形学直线扫描转论文,计算机图形学实验报告-实验1直线段扫描转换.doc...
PAGE 32 PAGE 7 计算机图形学 实验报告 班级 计算机工硕班 学号 2011220456 姓名 王泽晶 实验一:直线段扫描转换 实验目的 通过本次试验,学生可以掌握直线段的扫描转换算法及其 ...
- 计算机图形学画圆vc代码,计算机图形学实验--完整版-带结果--vc++实现.doc
计算机图形学实验--完整版-带结果--vc实现 计算机图形学实验报告 信息学院计算机专业 20081060183 周建明 综括: 利用计算机编程语言绘制图形,主要实现以下内容: (1).中点算法生成任 ...
- 如何用计算机画立方体,画立方体-计算机图形学实验.doc
画立方体-计算机图形学实验.doc (8页) 本资源提供全文预览,点击全文预览即可全文预览,如果喜欢文档就下载吧,查找使用更方便哦! 9.90 积分 计算机图形学实验--画立方体(通过视向变换等)具 ...
- 计算机图形学真实感显示代码,计算机图形学实验 - 真实感图形场景的生成
<计算机图形学实验 - 真实感图形场景的生成>由会员分享,可在线阅读,更多相关<计算机图形学实验 - 真实感图形场景的生成(4页珍藏版)>请在人人文库网上搜索. 1.计算机图形 ...
最新文章
- hadoop_入门1
- Oracle添加定时任务
- linux要不要home分区,有必要建/home/boot分区吗
- 初中生问题:求任意凸多边形的交叉面积
- 无法打开用户默认数据库,登录失败,用户‘sa’登录失败,错误:4064的解决方法...
- 深入理解嵌入式中重要的编程模型
- 豆瓣评分 9.4 的编程巨著!《算法》
- Bootstrap 按钮
- buildroot 文件系统添加telnet, ssh, 以及制作注意事项
- UNIAPP中IOS和安卓应用热更新和整包更新app的方法
- 4.OC仿写知乎客户端
- 项目难做,程序员难当,软件开发中的 9 大难题
- JAVA 实现发送邮件功能——邮箱验证码
- 原生JS实现躲避粒子小游戏
- 学计算机买华为还是买华硕,不考虑爱国因素,联想、华为、华硕等哪个品牌的笔记本电脑较好?...
- 小程序实现长按图片弹出保存图片、发送给朋友、识别图中码菜单。
- 相机标定板可以自己打印吗_我可以从手机或相机打印多大的照片?
- 经典美剧《越狱》口语精华及经典台词
- Google系列②布局平台战略
- 深入浅出FE(十四)深入浅出websocket