基于C++OpenGL实现的小桌茶壶纹理图形绘制
资源下载地址: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扩展来实现多纹理混合。分为以下几个步骤:
计算3个纹理各自的贡献,并将它们编码进顶点的颜色中,这样颜色的RGB部分控制纹理阶段0和1间的插值,颜色的ALPHA控制纹理阶段1和2间的插值。
使用GL_ARB_multitexture将3个纹理同时应用到物体表面。
将第一个纹理设为纹理阶段0。
在纹理阶段1,使用GL_INTERPOLATE_ARB在纹理阶段0的输出(第一个纹理)和阶段1的纹理之间用GL_SRC_COLOR(颜色的RGB部分)进行线性插值。
在纹理阶段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实现的小桌茶壶纹理图形绘制相关推荐
- 基于C++OpenGL实现的小桌茶壶图形绘制
资源下载地址:https://download.csdn.net/download/sheziqiong/85628081 实验目的和要求 在模型变换实验的基础上,通过实现下述实验内容,掌握OpenG ...
- Win32 OpenGL编程系列 2D例子 -- 七巧板图形绘制
write by 九天雁翎(JTianLing) -- blog.csdn.net/vagrxie 讨论新闻组及文件 OpenGL系列文章都已经写到3D部分了,但是感觉2D的例子还是少了点,特意弄个外 ...
- 基于C++OpenGL实现的小桌兔子图形绘制
资源下载地址:https://download.csdn.net/download/sheziqiong/85628187 实验目的和要求 在三维观察实验的基础上,通过实现下述实验内容,掌握OpenG ...
- Learn OpenGL (四):纹理
为了能够把纹理映射(Map)到三角形上,我们需要指定三角形的每个顶点各自对应纹理的哪个部分.这样每个顶点就会关联着一个纹理坐标(Texture Coordinate),用来标明该从纹理图像的哪个部分采 ...
- OpenGL从入门到精通--纹理
纹理 github源码仓库 opengl环境准备 opengl编程从入门到精通-hello,window OpenGL从入门到精通–你好三角形 OpenGL从入门到精通–着色器的使用 我们可以为每个顶 ...
- OPENGL ES 2.0 知识串讲 (10) ——OPENGL ES 详解IV(纹理优化)
上节回顾 上一节学习了如何从一张原始图片中,获取生成纹理所需要的信息,然后根据这些信息,通过OpenGL ES API在GPU内存中生成了一张纹理,并且还介绍了纹理属性,知道了如何通过纹理坐标将纹理映 ...
- VS2012下基于Glut OpenGL显示一些立体图形示例程序:
Glut下提供了一些现成的绘制立体的API,如glutWireSphere绘制球,glutWireCone绘制椎体,glutWireCube绘制立体,glutWireTorus绘制甜圈,glutWir ...
- OpenGL ES教程VI之纹理贴图(原文对照)
注:又是一篇,是否有人能解释得清楚,2是重复两次,那么是否N就是重复N次呢?接近1.0的坐标值整数部分加上几就是重复几次吗?这个好像之前验证过不一定的. 转自:http://melord.iteye. ...
- OpenGL学习十九:纹理过滤
当物体放大缩小时导致投影在上面的纹理也随着变化,OpenGL为了 优化其细节使其效果更好,因此可以采用纹理过滤 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MA ...
最新文章
- 学计算机一般要off,必须要学的电脑知识
- 猪行天下之Python基础——10.1 Python常用模块(上)
- 【软件工程】CMMI 能力成熟度模型集成 ( CMMI 过程管理过程域 | CMMI 项目管理过程域 ) ★
- Aarch64汇编语言
- 北京中考计算机,规则丨2018考生:2017北京中考统招计算机录取规则
- 洛谷 P3383 【模板】线性筛素数
- 如何转移域名到GoDaddy.com
- 商汤科技-数据运维工程师-提前批笔试题目汇总
- [工具类]DataTable与泛型集合List互转
- 【实验】修改数据文件名字的三种途径
- LTE通讯相关2:频带、信道带宽和频点号EARFCN
- Latex三线表格制作及相关问题
- catia中的螺旋伞齿轮画法_聚焦:螺旋伞齿轮画法要领
- UU跑腿前端中台方案
- Vue2.0搭建脚手架(vue-cli)
- python和jieba库进行简单文本处理之天龙八部小说
- 浅谈Anchor free与Anchor based
- 大学计算机品牌活动总结,【推荐】大学工作总结4篇
- 2018年3大UI设计趋势,你知道吗?
- 解决 OneNote 项目符号快捷键 Ctrl+. 在 Windows 10 下无效问题