资源下载地址:https://download.csdn.net/download/sheziqiong/85628707
资源下载地址:https://download.csdn.net/download/sheziqiong/85628707

实验目的和要求

在OpenGL消隐和光照实验的基础上,通过实现实验内容,掌握OpenGL中纹理的使用,并验证课程中关于纹理的内容。

实验内容和原理

使用Visual Studio C++编译已有项目工程。

模型尺寸不做具体要求。要求修改代码达到以下要求:

1.通过设置纹理,使得茶壶纹理为:

2.使得桌子纹理为:

3.对茶壶实现纹理和光照效果的混合

4.自己用代码产生一张纹理,并贴在茶壶表面,效果类似:

5.在桌面上实现两张纹理的叠合效果(附加项,完成可加分):

提示:glSolidCube()并不会为多边形指定纹理坐标,因此需要自己重写一个有纹理坐标的方块函数。另外,此实验需要用到 #include <windows.h>

主要仪器设备

Visual Studio C++

glut.zip

模板工程

操作方法和实验步骤

具体步骤按照参考资料的提示,对茶壶和桌子的纹理进行设置和更新。

读入纹理贴图部分的代码很像上学期DIP(图像信息处理)课上对于bmp文件的读写操作,所以就不再赘述。

加载纹理函数部分:

重点函数:

voidglBindTexture(GLenum target,GLuint texture); 将一个命名的纹理绑定到一个纹理目标上,参数target指定绑定目标,参数texture指定纹理的名字。

glBindTexture允许我们向GL_TEXTURE_1D, GL_TEXTURE_2D, GL_TEXTURE_3D, GL_TEXTURE_1D_ARRAY, GL_TEXTURE_2D_ARRAY, GL_TEXTURE_RECTANGLE, GL_TEXTURE_CUBE_MAP, GL_TEXTURE_CUBE_MAP_ARRAY, GL_TEXTURE_BUFFER, GL_TEXTURE_2D_MULTISAMPLE or GL_TEXTURE_2D_MULTISAMPLE_ARRAY 绑定一张纹理。当把一张纹理绑定到一个目标上时,之前对这个目标的绑定就会失效。纹理名字是一个无符号整数。值0是被保留的,它代表了每一个纹理目标的默认纹理。对于当前的GL渲染上下文中的共享对象空间,纹理名称以及它们对应的纹理内容是局部的;只有在显式开启上下文之间的共享,两个渲染上下文才可以共享纹理名称。

Mipmap——可以提高渲染性能与提升场景视觉质量的一个较为优秀的纹理技术,可以解决常见的闪烁和性能等问题。用glTexParameteri()函数就可以通过纹理参数来控制要加载的层级范围。

实验中用到的过滤方式:GL_TEXTURE_MAG_FILTER: 放大过滤, GL_TEXTURE_MIN_FILTER: 缩小过滤;GL_NEAREST:在mip基层上使用最近邻过滤。实际上,Mipmap的纹理过滤的方式还有如下:

常量 描述
GL_NEAREST 在mip基层上使用最邻近过滤
GL_LINEAR 在mip基层上使用线性过滤
GL_NEAREST_MIPMAP_NEAREST 选择最邻近的mip层,并使用最邻近过滤
GL_NEAREST_MIPMAP_LINEAR 在mip层之间使用线性插值和最邻近过滤
GL_LINEAR_MIPMAP_NEAREST 选择最邻近的mip层,使用线性过滤
GL_LINEAR_MIPMAP_LINEAR 在mip层之间使用线性插值和使用线性过滤,又称三线性mipmap

其中GL_NEAREST_MIPMAP_NEAAREST具有很好的性能,也能够解决闪烁的问题,但在视觉效果上会比较差。其中GL_LINEAR_MIPMAP_NEAREST常用于游戏加速,使用了质量较高的线性过滤,和快速的选择的方式(最邻近方式)。

GL_APICALL void GL_APIENTRY glTexImage2D(GLenum target, GLint level, GLenum internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const void* pixels);

参数说明

  • target 指定目标纹理,这个值必须是GL_TEXTURE_2D。

  • level 执行细节级别。0是最基本的图像级别,n表示第N级贴图细化级别。

  • internalformat 指定纹理中的颜色组件。可选的值有GL_ALPHA,GL_RGB,GL_RGBA,GL_LUMINANCE, GL_LUMINANCE_ALPHA 等几种。

  • width 指定纹理图像的宽度,必须是2的n次方。纹理图片至少要支持64个材质元素的宽度

  • height 指定纹理图像的高度,必须是2的m次方。纹理图片至少要支持64个材质元素的高度

  • border 指定边框的宽度。必须为0。

  • format 像素数据的颜色格式, 不需要和internalformatt取值必须相同。可选的值参考internalformat。

  • type 指定像素数据的数据类型。可以使用的值有GL_UNSIGNED_BYTE,GL_UNSIGNED_SHORT_5_6_5,GL_UNSIGNED_SHORT_4_4_4_4,GL_UNSIGNED_SHORT_5_5_5_1。

  • pixels 指定内存中指向图像数据的指针

定义纹理函数:

贴纹理并注意和光照效果混合(以茶壶为例),注意到增加了操作控制切换纹理与灯光的布尔量:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-8ZN4tKYR-1655101678346)(https://www.writebug.com/myres/static/uploads/2022/6/12/7a07d863f0fec69ab619788371ec7fb7.writebug)]

重点函数:纹理映射voidglTexEnvf(GLenumtarget,GLenumpname,GLfloatparam); 对于贴了纹理的模型,可以使用glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE,XX)来指定纹理贴图和材质混合的方式,从而产生特定的绘制效果。(XX为混合方式参数,OpenGL默认为GL_REPLACE,即只使用纹理)我们使用GL_MODULATE参数模式是把纹理元素的颜色乘以几何图元(进行光照计算之后)的颜色。通过这种模式,我们可以用彩色的几何图形与纹理结合来产生不同的效果。

至此,本次实验重头戏都已经完成,下面是加分项——纹理叠合的实现。

多纹理混合的实现原理:在OpenGL中通过ARB_multitexture和ARB_texture_env_combine扩展来实现多纹理混合。分为以下几个步骤:

  1. 计算3个纹理各自的贡献,并将它们编码进顶点的颜色中,这样颜色的RGB部分控制纹理阶段0和1间的插值,颜色的ALPHA控制纹理阶段1和2间的插值。

  2. 使用GL_ARB_multitexture将3个纹理同时应用到物体表面。

  3. 将第一个纹理设为纹理阶段0。

  4. 在纹理阶段1,使用GL_INTERPOLATE_ARB在纹理阶段0的输出(第一个纹理)和阶段1的纹理之间用GL_SRC_COLOR(颜色的RGB部分)进行线性插值。

  5. 在纹理阶段2,使用GL_INTERPOLATE_ARB在纹理阶段1的输出(第一个纹理和第二个纹理的混合体)和阶段2的纹理之间用GL_SRC_COLOR(颜色的ALPHA部分)进行线性插值。

当然现在在新版本的OpenGL中用shader来实现会方便很多……鉴于OpenGL版本问题,我们还是用这几个扩展方法来实现。

混合纹理的设置:

绘制多纹理物体也是采用单独绘制的方法,其中调用了如下函数:

void glActiveTexture(GLenum texUnit); 选择可以由纹理函数进行修改的当前纹理单位,texUnit是一个符号常量,其形式为GL_TEXTUREi,其中i的范围是从0到k-1,k是纹理单位的最大数量。
void glMultiTexCoord2f(GLenum texUnit, const TYPE* coords); 将参数coords中的纹理坐标数据(s,t,r,q)用于纹理单位texUnit。texUnit参数所使用的枚举值与glActiveTexture()函数相同。

实验数据记录和处理

(略)

实验结果与分析


资源下载地址:https://download.csdn.net/download/sheziqiong/85628707
资源下载地址:https://download.csdn.net/download/sheziqiong/85628707

基于C++OpenGL实现的小桌茶壶纹理图形绘制相关推荐

  1. 基于C++OpenGL实现的小桌茶壶图形绘制

    资源下载地址:https://download.csdn.net/download/sheziqiong/85628081 实验目的和要求 在模型变换实验的基础上,通过实现下述实验内容,掌握OpenG ...

  2. Win32 OpenGL编程系列 2D例子 -- 七巧板图形绘制

    write by 九天雁翎(JTianLing) -- blog.csdn.net/vagrxie 讨论新闻组及文件 OpenGL系列文章都已经写到3D部分了,但是感觉2D的例子还是少了点,特意弄个外 ...

  3. 基于C++OpenGL实现的小桌兔子图形绘制

    资源下载地址:https://download.csdn.net/download/sheziqiong/85628187 实验目的和要求 在三维观察实验的基础上,通过实现下述实验内容,掌握OpenG ...

  4. Learn OpenGL (四):纹理

    为了能够把纹理映射(Map)到三角形上,我们需要指定三角形的每个顶点各自对应纹理的哪个部分.这样每个顶点就会关联着一个纹理坐标(Texture Coordinate),用来标明该从纹理图像的哪个部分采 ...

  5. OpenGL从入门到精通--纹理

    纹理 github源码仓库 opengl环境准备 opengl编程从入门到精通-hello,window OpenGL从入门到精通–你好三角形 OpenGL从入门到精通–着色器的使用 我们可以为每个顶 ...

  6. OPENGL ES 2.0 知识串讲 (10) ——OPENGL ES 详解IV(纹理优化)

    上节回顾 上一节学习了如何从一张原始图片中,获取生成纹理所需要的信息,然后根据这些信息,通过OpenGL ES API在GPU内存中生成了一张纹理,并且还介绍了纹理属性,知道了如何通过纹理坐标将纹理映 ...

  7. VS2012下基于Glut OpenGL显示一些立体图形示例程序:

    Glut下提供了一些现成的绘制立体的API,如glutWireSphere绘制球,glutWireCone绘制椎体,glutWireCube绘制立体,glutWireTorus绘制甜圈,glutWir ...

  8. OpenGL ES教程VI之纹理贴图(原文对照)

    注:又是一篇,是否有人能解释得清楚,2是重复两次,那么是否N就是重复N次呢?接近1.0的坐标值整数部分加上几就是重复几次吗?这个好像之前验证过不一定的. 转自:http://melord.iteye. ...

  9. OpenGL学习十九:纹理过滤

    当物体放大缩小时导致投影在上面的纹理也随着变化,OpenGL为了 优化其细节使其效果更好,因此可以采用纹理过滤 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MA ...

最新文章

  1. 学计算机一般要off,必须要学的电脑知识
  2. 猪行天下之Python基础——10.1 Python常用模块(上)
  3. 【软件工程】CMMI 能力成熟度模型集成 ( CMMI 过程管理过程域 | CMMI 项目管理过程域 ) ★
  4. Aarch64汇编语言
  5. 北京中考计算机,规则丨2018考生:2017北京中考统招计算机录取规则
  6. 洛谷 P3383 【模板】线性筛素数
  7. 如何转移域名到GoDaddy.com
  8. 商汤科技-数据运维工程师-提前批笔试题目汇总
  9. [工具类]DataTable与泛型集合List互转
  10. 【实验】修改数据文件名字的三种途径
  11. LTE通讯相关2:频带、信道带宽和频点号EARFCN
  12. Latex三线表格制作及相关问题
  13. catia中的螺旋伞齿轮画法_聚焦:螺旋伞齿轮画法要领
  14. UU跑腿前端中台方案
  15. Vue2.0搭建脚手架(vue-cli)
  16. python和jieba库进行简单文本处理之天龙八部小说
  17. 浅谈Anchor free与Anchor based
  18. 大学计算机品牌活动总结,【推荐】大学工作总结4篇
  19. 2018年3大UI设计趋势,你知道吗?
  20. 解决 OneNote 项目符号快捷键 Ctrl+. 在 Windows 10 下无效问题

热门文章

  1. Ubuntu20.04如何搭建ROS开发环境
  2. 基于Python PHP+mysql的校园电脑外设的电商平台
  3. 气象雷达回波图中区域地物杂波检测算法
  4. 计算机网络的发展趋势_MobiHoc-B类会议佼佼者 | CCF计算机网络领域
  5. DarkNet安装配置
  6. java毕业设计小区物业管理系统mybatis+源码+调试部署+系统+数据库+lw
  7. 招远服务器维修,招远商铺停车场挡车器施工方案
  8. 海湾GST9000通过现有的网线联网方案
  9. 20世纪PC上的单机游戏发展历史
  10. 低功耗蓝牙模块的工作原理是怎样的