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基本概念入门——纹理贴图相关推荐

  1. OpenGL ES之十——纹理贴图(展示一张图片)

    概述 这是一个系列的Android平台下OpenGl ES介绍,从最基本的使用最终到VR图的展示的实现,属于基础篇.(后面针对VR视频会再有几篇文章,属于进阶篇) OpenGL ES之一--概念扫盲 ...

  2. OpenGL总结6-圆柱纹理贴图

    圆柱纹理贴图我采用了OpenGL中的函数gluCylinder,这个函数会生成空心的圆柱,这个圆柱固定生成为底面位于xy面,z=0,顶面从z=0开始向z轴正方向,也就是说圆柱体是冲着我们生成的,如果想 ...

  3. OpenGL ES绘制3D纹理贴图

    最近看了<疯狂android讲义>的图形相关的内容,结合自己的理解,整理了一下. 下图是做出来的3D纹理贴图效果,手指在屏幕滑动时,图片可以随之转动. 要实现一个纹理贴图,很简单,大致需要 ...

  4. openGL之glsl入门6--画三维图魔方、圆柱体

    这一章介绍坐标变换与矩阵相关内容,对应红宝书第5章内容,并通过两个简单的例子展示矩阵变换的效果. 1. 坐标变换 变换的类型有多种,包括视图.模型.投影.视口变换等,概念可以参照红宝书5.1章节,概念 ...

  5. android 使用OPENGL ES实现三角形纹理贴图效果-纹理映射基础

    效果图:...... 编写Dad.java *在Dad构造器中创建和设置场景渲染器为主动渲染,并设置重写触屏时间回调方法以记录触控笔坐标,改变三角形坐标系的位置,使三角形能够在场景中转动 *为声明场景 ...

  6. 【OpenGL学习笔记④】——纹理贴图【SOIL2的配置 + 绘制木板 + 纹理环绕】

  7. C++ Opengl纹理贴图源码

    C++ Opengl纹理贴图源码 项目开发环境 项目功能 项目演示 项目源码传送门 项目开发环境 开发语言:C++和IDE:VS2017,操作系统Windows版本windows SDK8.1,三方库 ...

  8. 现代opengl 设计入门,纹理贴图

    上节 现代opengl 设计入门,着色器  介绍了着色器语言GLSL, 可以绘制多彩的三角形.这节介绍更高级的着色,纹理贴图. 先做纹理贴图的基本介绍,然后介绍其中几个重要设置:纹理环绕方式,纹理过滤 ...

  9. 现代opengl 设计入门,坐标系统和立方体的纹理贴图

    本文在 现代opengl 设计入门,纹理贴图 一文的基础上,引入opengl坐标系统,实现立方体的纹理贴图.介绍了opengl 的5个空间,3个变换矩阵.如果看这部分介绍比较繁琐,可以直接看看效果图, ...

最新文章

  1. 学习dubbo(一): 简介
  2. CUDA、CUDA toolkit、CUDNN、NVCC关系
  3. 【Android 逆向】Linux 文件权限 ( Linux 权限简介 | 系统权限 | 用户权限 | 匿名用户权限 | 读 | 写 | 执行 | 更改组 | 更改用户 | 粘滞 )
  4. 1.Java之路(Java语言发展和概述以及特点)
  5. std::remove
  6. mvc html.display,Asp.Net MVC中的Html.DisplayFor()用于项目列表
  7. oracletns中不存在名称为_关于数据库:向SQL Developer添加新连接时未显示Oracle TNS名称...
  8. 看门狗性能软件测试,《看门狗:军团》PC版性能测试 不建议光追,优化极差
  9. 大学英语期末考计算机上答卷,英语期末考试质量分析
  10. 工作上碰到的技术问题积累
  11. 数据仓库分层架构深度讲解
  12. 五种不同的微博评论数据获取方法
  13. Linux串口ttyUSB设置
  14. 51单片机,485,测试03/05/06
  15. 若依项目环境搭建及使用
  16. 前端基础学习之css3-(border-image)实现边框图片自适应填充
  17. mapping 映射的简单操作
  18. 想提高团队技术,来试试这个套路! (作为个人提高的套路也行呢)
  19. 机器学习概述和特征工程
  20. 全面预算管控 提升企业运营管理竞争力

热门文章

  1. Java_Josephus problem 约瑟夫环详尽分享
  2. 墙裂推荐!7个最佳的学习Python编程的开源库!
  3. A Game of Thrones (0)
  4. 常见的设计模式(单例模式工厂模式)
  5. Arduino PAJ7620手势识别传感器 实验
  6. 机器学习之期望最大算法
  7. 什么是打jar包 什么是打war包 他们一样吗
  8. html5动画模板_使基本HTML模板更上一层楼的动画
  9. 父亲节用计算机给惊喜,做趣味爱心贺卡 父亲节给老爸一个惊喜
  10. 成绩排序(p32)排序