2. glTexCoord2f() 函数
原型:glTexCoord2f(GLfloat s,GLfloat t);
s代表x坐标,t代表y坐标;
s∈[0.0,1.0],t∈[0.0,1.0];
一张位图的4个坐标顶点分别为:左下角(0.0,0.0),右下角(1.0,0.0)右上角(1.0,1.0),左上角(0.0,1.0)。0.0f 是纹理的左侧。 0.5f 是纹理的中点, 1.0f 是纹理的右侧。

用法:通常配合glVertex3fv使用,glTexCoord2f用来定义纹理左边,glVertex3fv用来定义几何定点坐标。

注意:opengl2.0之前载入的位图大小要求是2的n次幂(即1,2,4,8,16,32等),否则纹理将无法显示。虽然opengl2.0之后不要求纹理是2的n次幂了,但这不保证性能。考虑性能的话,一般还是把纹理做成2的n次幂。

如果左右搞反了:为了将纹理正确的映射到四边形上,必须将纹理的右上角映射到四边形的右上角,纹理的左上角映射到四边形的左上角,纹理的右下角映射到四边形的右下角,纹理的左下角映射到四边形的左下角。如果映射错误的话,图像显示时可能上下颠倒,侧向一边或者什么都不是。

简单示例

glTexCoord2f( 0.0, 0.0 ); glVertex3f( -1.0, -1.0, 1.0 );
glTexCoord2f( 1.0, 0.0 ); glVertex3f( 1.0, -1.0, 1.0 );
glTexCoord2f( 1.0, 1.0 ); glVertex3f( 1.0, 1.0, 1.0 );
glTexCoord2f( 0.0, 1.0 ); glVertex3f( -1.0, 1.0, 1.0 );
纹理相关知识
概述

概括的说, 纹理映射机制允许你将一个图像关联到一个多边形上,从而呈现出真实视觉效果。例如, 你可以将书的封面图像应用到一个方形上, 这样这个方形看起来就像是一本书了。 你可以将地球的地图通过纹理映射应用到一个球体上, 那么这个球体就是一个3D的具真实感的地球了。纹理映射在当今的3D图形应用上处处皆是。游戏都是通过纹理映射来作为虚拟真实的第一个步骤。然而纹理加载的过程可能会影响程序运行速度,当纹理图像非常大时,这种情况尤为明显。如何妥善的管理纹理,减少不必要的开销,是系统优化时必须考虑的一个问题。其中OpenGL提供了纹理对象对象管理技术来解决上述问题。与显示列表一样,纹理对象通过一个单独的数字来标识。这允许OpenGL硬件能够在内存中保存多个纹理,而不是每次使用的时候再加载它们,从而减少了运算量,提高了速度。

纹理映射是一个二维的数组。数组中的每一项称之为纹理点( texel )。 虽然这个数组是二维的, 但是可以映射到非二维的对象上, 如球体或者其他的 3D 对象模型上。

比较常见的是, 开发者在他们的图形应用中运用二维纹理, 当然一维或者三维的纹理也并非未闻。二维纹理有宽度和高度决定二维。一维纹理也有宽度和高度, 只是高度被设为值 1(单位:像素 pixel). 而三维纹理不仅具有宽度和高度, 还有深度, 所以三维为纹理又称为立体纹理。我们讨论的主要是二维纹理。

大概步骤:

1.创建纹理对象,并为他指定一个纹理.

2.确定纹理如何应用到每个像素上.

3.启用纹理贴图

4.绘制场景,提供纹理和几何坐标

过滤: 由于我们提供的纹理图像很少能和最终的屏幕坐标形成对应,大小不同,所以需要设置过滤项目.允许我们进行插值或者匀和,指定放大缩小的函数.glTexParameter*(),使用过滤模式GL_NEAREST那么纹理单位最邻近的将被使用,GL_LINEAR那么就用2*2的包含纹理数据的数组加权组作为纹理;

命名纹理对象: glGenTexures(GLSize n,Gluint *textureNames); n为产生n个未使用的对象值,textureNames为纹理名字数组,你可能有几个纹理需要使用,这个数组来区分.

1.你需要载入图片时候的纹理定义

先看glTexImage2D()函数定义:

void glTexImage2D(GLenum target,
          GLint level,
          GLint internalFormat,
          GLsizei width,
          GLsizei height,
          GLint border,
          GLenum format,
          GLenum type,
          const GLvoid * data);

定义一个二维纹理映射。target是常数 GL_TEXTURE_2D, level表示多级分辨率的纹理图象的级数。若只有一种分辨率,level为0。components是从1到4的整数,1:选择R;2:选择R A;3:选择R G B;

再看glTexImage2D()用法举例:

glTexImage2D(GL_TEXTURE_2D,  //此纹理是一个2D纹理
        0,          //代表图像的详细程度, 默认为0即可
        3,          //颜色成分R(红色分量)、G(绿色分量)、B(蓝色分量)三部分,若为4则是R(红色分量)、G(绿色分量)、B(蓝色分量)、Alpha
        TextureImage[0]->sizeX,  //纹理的宽度
        TextureImage[0]->sizeY,  //纹理的高度
        0,          //边框的值
        GL_RGB,      //告诉OpenGL图像数据由红、绿、蓝三色数据组成
        GL_UNSIGNED_BYTE,    //组成图像的数据是无符号字节类型
        TextureImage[0]->data);  //告诉OpenGL纹理数据的来源,此例中指向存放在TextureImage[0]记录中的数据

先看gluBuild2DMipmaps()函数定义:

int gluBuild2DMipmaps (GLenum target,
            GLint components,
            GLint width,
            GLint height,
            GLenum format,
            GLenum type,
            const void *data);

再看gluBuild2DMipmaps()用法举例:
gluBuild2DMipmaps(GL_TEXTURE_2D,  //此纹理是一个2D纹理
          3,            //颜色成分R(红色分量)、G(绿色分量)、B(蓝色分量)三部分,若为4则是R(红色分量)、G(绿色分量)、B(蓝色分量)、Alpha
          TextureImage[0]->sizeX,  //纹理的宽度
          TextureImage[0]->sizeY,  //纹理的高度
          GL_RGB,       //告诉OpenGL图像数据由红、绿、蓝三色数据组成
          GL_UNSIGNED_BYTE,    //组成图像的数据是无符号字节类型
          TextureImage[0]->data);  //告诉OpenGL纹理数据的来源,此例中指向存放在TextureImage[0]记录中的数据

glTexImage2D()和gluBuild2DMipmaps()使用注意事项:

使用glTexImage2D()时所采用的位图文件分辨率必须为:64×64、128×128、256×256三种格式,如果其他大小则会出现绘制不正常。

gluBuild2DMipmaps()支持任意分辨率位图文件。

绑定纹理对象: glBindTexture(Glenum target,Gluint,glTexImage*),将把数据存储到这个纹理对象中,如果需要纹理图像的颜色和物体表面的颜色进行组合,不是直接贴图,那么就需要glTexEvn*()函数.

确定纹理坐标: glTexCoord2f(1.of,1.Of);glVertex3f(1.Of,1.Of,0.Of);比如这一句话.对于设置纹理贴图的坐标和绘图坐标的确定问题.一般的情况假设纹理和图片都是正方形的,那么我们希望纹理映射到整个物体上面,这个时候纹理坐标按照逆时针放心依次(0,0),(1,0),(1,1),(0,1),其中的四个坐标只是代表的向量,并不是真实的坐标,如果是要一半贴到物体上就应该是0.5的值了,假如你给的纹理坐标大于1,那么将会贴多个纹理,比如值为2的时候,会有4个纹理贴图.

基本函数

纹理映射 glEnable() 和 glDisable() 来开闭;

纹理对象  glGenTexture(Glsizei n, GLuint *texture);

纹理绑定 glBindTexture(GLenum target, GLuint texture);

删除纹理对象  glDeleteTexure(Glsizei n, Gluint *texture);

驻留纹理 GLboolean glAreTexturesResident (GLsizei n, GLuint *textures, GLboolean *residents);

纹理优先级 glPrioritizeTextures (GLsizei n, GLuint *textures, GLclampf *priorities);

指定纹理  glTexImage1D(), glTexImage2D(), glTexImage3D(). 这三个版本用于相应维数的纹理;

纹理过滤 :

glTexParameter*(GL_TEXTURE_2D,GL_TEXTURE_WRAP_S/T,GL_REPEAT/GL_CLAMP);

GL_REPEAT:当纹理比表面小时重复使用纹理以填满每个点。
GL_CLAMP:比1大的当作1,比0小的当作0。

glTexParameter*(GL_TEXTURE_2D,GL_TEXTURE_MAG/MIN_FILTER,GL_NEAREST/GL_LINEAR)

GL_NEAREST:取比较接近的那个像素。
GL_LINEAR:以周围四个像素的平均值做为纹理。
bilinear:二次插值,精度更高,但需要自己动手计算。

若是mip 贴图模式

glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_NEAREST/LINEAR);  
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR_MIPMAP_NEAREST/LINEAR);

参考链接:

OpenGL超级宝典笔记——纹理映射(一)

OpenGL纹理映射总结

OpenGl 之学习笔记 glTexCoord2f() 函数以及纹理相关知识总结相关推荐

  1. C语言学习笔记一(C语言相关知识)

    C语言学习第一节 文章目录 C语言学习第一节 一.C语言发展史 二.C语言的特点 三.C语言标准 一.C语言发展史 C语言诞生于美国的贝尔实验室,由丹尼斯·里奇(Dennis MacAlistair ...

  2. PR学习笔记——效果控件的相关知识

    效果控件 1.一般调节音量 2.左右鼠标一起点击或者alt+鼠标左键 3.钢笔工具是增添关键帧的 4.alt+ctrl 换视频的位置

  3. JavaWeb学习笔记(一)---Web相关知识和HTTP协议

    一.Web相关知识 1.Web资源 Internet上供外界访问的web资源分为: (1)静态web资源(如html页面):web页面中供人们浏览的数据始终不变. (2)动态web:web页面中供人们 ...

  4. OpenGL学习笔记(十三):将纹理贴图应用到四边形上,对VAO/VBO/EBO/纹理/着色器的使用方式进行总结

    原博主博客地址:http://blog.csdn.net/qq21497936 本文章博客地址:http://blog.csdn.net/qq21497936/article/details/7919 ...

  5. OpenGL入门学习笔记(一)——简单实现FFT海洋

    一.前言 文章不赘述OpenGL的使用入门,使用入门请参考LearnOpenGL CN(https://learnopengl-cn.github.io/). 文章主要参考: [1][学习笔记]Uni ...

  6. python函数是一段具有特定功能的语句组_Python学习笔记(五)函数和代码复用

    本文将为您描述Python学习笔记(五)函数和代码复用,具体完成步骤: 函数能提高应用的模块性,和代码的重复利用率.在很多高级语言中,都可以使用函数实现多种功能.在之前的学习中,相信你已经知道Pyth ...

  7. Python学习笔记:函数(Function)

    Python学习笔记:函数(Function) 一.函数基本概念 函数是Python里组织与重用代码最重要的方法.一般来说,如果你期望多次重复相同或相似的代码,写一个可重用的函数可能是值得的.函数通过 ...

  8. php中声明一个函数,php学习笔记之 函数声明

    /* 函数定义: * 1.函数是一个被命名的 * 2.独立的代码段 * 3.函数执行特定任务 * 4.并可以给调用它的程序返回一个值 * * 函数的优点: * 1.提高程序的重用性 * 2.提高程序的 ...

  9. Matlab学习笔记 figure函数

    Matlab学习笔记 figure函数 matlab中的 figure 命令,能够创建一个用来显示图形输出的一个窗口对象.每一个这样的窗口都有一些属性,例如窗口的尺寸.位置,等等.下面一一介绍它们. ...

最新文章

  1. asp.net提交危险字符处理方法之一
  2. centos 升级4.0 内核
  3. 推荐7本EEG领域值得阅读的书籍
  4. python输入球的半径_基于用户输入半径的Myro移动机器人
  5. 【Android 逆向】IDA 工具使用 ( 十六进制视图 Hex View-1 | 结构体视图 Structures | 枚举视图 Enums | 导入视图 Import | 导出视图 )
  6. java面向对象思想如何理解
  7. access设计视图打不开_定制橱柜衣柜怎么测量才能避免出错?(设计师必看)
  8. Android Camera 系统架构源码分析
  9. 利用Office Chart 制作柱图(一个柱子)
  10. SQL必知必会-检索数据
  11. 递归(二)-------经典递归实例(汉诺塔问题)
  12. 分析“关于Linux内核引入的accept_local参数的一个问题”
  13. 安装虚拟机遇到和小红帽遇到的问题
  14. ipad文献管理软件_使用ipad看文献,有哪些好用的工具软件?
  15. 使用深度学习技术进行水印去除
  16. 论文阅读笔记—Exploring Visual Relationship for Image Captioning
  17. 关于hive on spark的distribute by和group by使用以及小文件合并问题
  18. windows2012R2安装Microsoft Visual C++ 2015 Redistributable报错,提示0x80240017错误代码
  19. 基于python实现的双月模型
  20. Latex-插入eps图片失败解决方法“ Latex Package pdftex.def Error....”

热门文章

  1. CSS - 网格布局(grid)
  2. html5设计九宫格页面,Html5响应式设计实现九宫格,html5响应九宫格
  3. Android 禁止程序常驻内存,【教程】教你如何让指定APP常驻内存
  4. 华为nova3e支持鸿蒙系统吗,华为nova 3e值不值得买?HUAWEI nova 3e深度体验评测
  5. 大一怎么学好c语言_教你一招:计算机专业大一新生,如何能够有效学习 C 语言?...
  6. Python基金投资回测
  7. FISCO BCOS 联盟链Max搭建
  8. 国内AR技术领头羊十二居对ARKit充满期望!
  9. Computational and Mathematical Methods in Medicine
  10. 《程序设计基础》 第十章 函数与程序结构 7-1 圆形体体积计算器 (20 分)