OpenGL基本概念入门——纹理贴图
1. 创建纹理图像
OpenGL要求纹理的高度和宽度都必须是2的n次方大小,只有满足这个条件,这个纹理图片才是有效的。 一旦获取了像素值,我们就可以将这些数据传给OpenGL,让OpenGL生成一个纹理贴图:
glGenTextures(1,@Texture);
glBindTexture(GL_TEXTURE_2D,Texture);
glTexImage2D(GL_TEXTURE_2D,0,3,Bit.Width,Bit.Height,0,GL_RGB,GL_UNSIGNED_BYTE,Pixels);
glGenTextures和glBindTexture函数用于创建和绑定纹理对象,glTexImage2D函数将Pixels数组中的像素值传给当前绑定的纹理对象,于是便创建了纹理。glTexImage函数的参数分别是纹理的类型,纹理的等级,每个像素的字节数,纹理图像的宽度和高度,边框大小,像素数据的格式,像素值的数据类型,像素数据。
2. OpenGL中的贴图方式
OpenGL为我们提供了三种纹理——GL_TEXTURE_1D、GL_TEXTURE_2D和GL_TEXTURE_3D。它们分别表示1维纹理、2维纹理和3维纹理。无论是哪一中纹理,使用方法都是相同的:即先创建一个纹理对象和一个存储纹理数据的n维数组,在调用glTexImageN D函数来传入相应的纹理数据。除此之外,我们可以一些函数来设置纹理的其他特性。
2.1 设置贴图模式
OpenGL提供了3种不同的贴图模式:GL_MODULATE,GL_DECAL和GL_BLEND。默认情况下,贴图模式是GL_MODULATE,在这种模式下,OpenGL会根据当前的光照系统调整物体的色彩和明暗。第二种模式是GL_DECAL,在这种模式下所有的光照效果都是无效的,OpenGL将仅依据纹理贴图来绘制物体的表面。最后是GL_BLEND,这种模式允许我们使用混合纹理。在这种模式下,我们可以把当前纹理同一个颜色混合而得到一个新的纹理。我们可以调用glTexEnvi函数来设置当前贴图模式:
glTexEnvi(GL_TEXTURE_ENV,GL_TEXTURE_ENV_MODE,TextureMode);
其中TextureMode就是想要设置的纹理模式,可以为GL_MODULATE,GL_DECAL和GL_BLEND中的任何一种。
另外,对于GL_BLEND模式,我们可以调用
glTexEnvfv(GL_TEXUTRE_ENV,GL_TEXTURE_ENV_COLOR,@ColorRGBA);
其中,ColorRGBA为一个表示RGBA颜色的4维数组。
2.2 纹理滤镜
在纹理映射的过程中,如果图元的大小不等于纹理的大小,OpenGL便会对纹理进行缩放以适应图元的尺寸。我们可以通过设置纹理滤镜来决定OpenGL对某个纹理采用的放大、缩小的算法。
调用glTexParameter来设置纹理滤镜。如:
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILETER, MagFilter);//设置放大滤镜
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER, MinFilter); //设置缩小滤镜
上述调用中,第一个参数表明是针对何种纹理进行设置,第二个参数表示要设置放大滤镜还是缩小滤镜。第三个参数表示使用的滤镜。可以为下面的值之一:
表6.3-1 可使用的纹理滤镜 | |
滤镜 | 描述 |
GL_NEAREST | 取最邻近像素 |
GL_LINEAR | 线性内部插值 |
GL_NEAREST_MIPMAP_NEAREST | 最近多贴图等级的最邻近像素 |
GL_NEAREST_MIPMAP_LINEAR | 在最近多贴图等级的内部线性插值 |
GL_LINEAR_MIPMAP_NEAREST | 在最近多贴图等级的外部线性插值 |
GL_LINEAR_MIPMAP_LINEAR | 在最近多贴图等级的外部和内部线性插值 |
3 纹理映射
3.1 纹理坐标
要使用当前的纹理绘制图元,我们必须在绘制每个顶点之前为该顶点指定纹理坐标。只需调用
glTexCoord2d(s:Double;t:Double);
函数即可。其中,s、t是对于2D纹理而言的s、t坐标。对于任何纹理,它的纹理坐标都如同图6.4-1所示的那样:
对于任何纹理,无论纹理的真正大小如何,其顶端(左上角)的纹理坐标恒为(0,0),右下角的纹理坐标恒为(1,1)。也就是说,纹理坐标应是一个介于0到1之间的一个小数。
例如,下面的代码将使用当前纹理绘制一个三角形:
glBindTexture(Tex);
glBegin(GL_TRIANGLES);
glTexCoord2d(0,0);
glVertex3f(-10,-10,0);
glTexCoord2d(0,1);
glVertex3f(-10,10,0);
glTexCoord2d(1,1);
glVertex3f(10,10,0);
glEnd();
OpenGL基本概念入门——纹理贴图相关推荐
- OpenGL ES之十——纹理贴图(展示一张图片)
概述 这是一个系列的Android平台下OpenGl ES介绍,从最基本的使用最终到VR图的展示的实现,属于基础篇.(后面针对VR视频会再有几篇文章,属于进阶篇) OpenGL ES之一--概念扫盲 ...
- OpenGL总结6-圆柱纹理贴图
圆柱纹理贴图我采用了OpenGL中的函数gluCylinder,这个函数会生成空心的圆柱,这个圆柱固定生成为底面位于xy面,z=0,顶面从z=0开始向z轴正方向,也就是说圆柱体是冲着我们生成的,如果想 ...
- OpenGL ES绘制3D纹理贴图
最近看了<疯狂android讲义>的图形相关的内容,结合自己的理解,整理了一下. 下图是做出来的3D纹理贴图效果,手指在屏幕滑动时,图片可以随之转动. 要实现一个纹理贴图,很简单,大致需要 ...
- openGL之glsl入门6--画三维图魔方、圆柱体
这一章介绍坐标变换与矩阵相关内容,对应红宝书第5章内容,并通过两个简单的例子展示矩阵变换的效果. 1. 坐标变换 变换的类型有多种,包括视图.模型.投影.视口变换等,概念可以参照红宝书5.1章节,概念 ...
- android 使用OPENGL ES实现三角形纹理贴图效果-纹理映射基础
效果图:...... 编写Dad.java *在Dad构造器中创建和设置场景渲染器为主动渲染,并设置重写触屏时间回调方法以记录触控笔坐标,改变三角形坐标系的位置,使三角形能够在场景中转动 *为声明场景 ...
- 【OpenGL学习笔记④】——纹理贴图【SOIL2的配置 + 绘制木板 + 纹理环绕】
- C++ Opengl纹理贴图源码
C++ Opengl纹理贴图源码 项目开发环境 项目功能 项目演示 项目源码传送门 项目开发环境 开发语言:C++和IDE:VS2017,操作系统Windows版本windows SDK8.1,三方库 ...
- 现代opengl 设计入门,纹理贴图
上节 现代opengl 设计入门,着色器 介绍了着色器语言GLSL, 可以绘制多彩的三角形.这节介绍更高级的着色,纹理贴图. 先做纹理贴图的基本介绍,然后介绍其中几个重要设置:纹理环绕方式,纹理过滤 ...
- 现代opengl 设计入门,坐标系统和立方体的纹理贴图
本文在 现代opengl 设计入门,纹理贴图 一文的基础上,引入opengl坐标系统,实现立方体的纹理贴图.介绍了opengl 的5个空间,3个变换矩阵.如果看这部分介绍比较繁琐,可以直接看看效果图, ...
最新文章
- 学习dubbo(一): 简介
- CUDA、CUDA toolkit、CUDNN、NVCC关系
- 【Android 逆向】Linux 文件权限 ( Linux 权限简介 | 系统权限 | 用户权限 | 匿名用户权限 | 读 | 写 | 执行 | 更改组 | 更改用户 | 粘滞 )
- 1.Java之路(Java语言发展和概述以及特点)
- std::remove
- mvc html.display,Asp.Net MVC中的Html.DisplayFor()用于项目列表
- oracletns中不存在名称为_关于数据库:向SQL Developer添加新连接时未显示Oracle TNS名称...
- 看门狗性能软件测试,《看门狗:军团》PC版性能测试 不建议光追,优化极差
- 大学英语期末考计算机上答卷,英语期末考试质量分析
- 工作上碰到的技术问题积累
- 数据仓库分层架构深度讲解
- 五种不同的微博评论数据获取方法
- Linux串口ttyUSB设置
- 51单片机,485,测试03/05/06
- 若依项目环境搭建及使用
- 前端基础学习之css3-(border-image)实现边框图片自适应填充
- mapping 映射的简单操作
- 想提高团队技术,来试试这个套路! (作为个人提高的套路也行呢)
- 机器学习概述和特征工程
- 全面预算管控 提升企业运营管理竞争力