OpenGl 之学习笔记 glTexCoord2f() 函数以及纹理相关知识总结
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() 函数以及纹理相关知识总结相关推荐
- C语言学习笔记一(C语言相关知识)
C语言学习第一节 文章目录 C语言学习第一节 一.C语言发展史 二.C语言的特点 三.C语言标准 一.C语言发展史 C语言诞生于美国的贝尔实验室,由丹尼斯·里奇(Dennis MacAlistair ...
- PR学习笔记——效果控件的相关知识
效果控件 1.一般调节音量 2.左右鼠标一起点击或者alt+鼠标左键 3.钢笔工具是增添关键帧的 4.alt+ctrl 换视频的位置
- JavaWeb学习笔记(一)---Web相关知识和HTTP协议
一.Web相关知识 1.Web资源 Internet上供外界访问的web资源分为: (1)静态web资源(如html页面):web页面中供人们浏览的数据始终不变. (2)动态web:web页面中供人们 ...
- OpenGL学习笔记(十三):将纹理贴图应用到四边形上,对VAO/VBO/EBO/纹理/着色器的使用方式进行总结
原博主博客地址:http://blog.csdn.net/qq21497936 本文章博客地址:http://blog.csdn.net/qq21497936/article/details/7919 ...
- OpenGL入门学习笔记(一)——简单实现FFT海洋
一.前言 文章不赘述OpenGL的使用入门,使用入门请参考LearnOpenGL CN(https://learnopengl-cn.github.io/). 文章主要参考: [1][学习笔记]Uni ...
- python函数是一段具有特定功能的语句组_Python学习笔记(五)函数和代码复用
本文将为您描述Python学习笔记(五)函数和代码复用,具体完成步骤: 函数能提高应用的模块性,和代码的重复利用率.在很多高级语言中,都可以使用函数实现多种功能.在之前的学习中,相信你已经知道Pyth ...
- Python学习笔记:函数(Function)
Python学习笔记:函数(Function) 一.函数基本概念 函数是Python里组织与重用代码最重要的方法.一般来说,如果你期望多次重复相同或相似的代码,写一个可重用的函数可能是值得的.函数通过 ...
- php中声明一个函数,php学习笔记之 函数声明
/* 函数定义: * 1.函数是一个被命名的 * 2.独立的代码段 * 3.函数执行特定任务 * 4.并可以给调用它的程序返回一个值 * * 函数的优点: * 1.提高程序的重用性 * 2.提高程序的 ...
- Matlab学习笔记 figure函数
Matlab学习笔记 figure函数 matlab中的 figure 命令,能够创建一个用来显示图形输出的一个窗口对象.每一个这样的窗口都有一些属性,例如窗口的尺寸.位置,等等.下面一一介绍它们. ...
最新文章
- asp.net提交危险字符处理方法之一
- centos 升级4.0 内核
- 推荐7本EEG领域值得阅读的书籍
- python输入球的半径_基于用户输入半径的Myro移动机器人
- 【Android 逆向】IDA 工具使用 ( 十六进制视图 Hex View-1 | 结构体视图 Structures | 枚举视图 Enums | 导入视图 Import | 导出视图 )
- java面向对象思想如何理解
- access设计视图打不开_定制橱柜衣柜怎么测量才能避免出错?(设计师必看)
- Android Camera 系统架构源码分析
- 利用Office Chart 制作柱图(一个柱子)
- SQL必知必会-检索数据
- 递归(二)-------经典递归实例(汉诺塔问题)
- 分析“关于Linux内核引入的accept_local参数的一个问题”
- 安装虚拟机遇到和小红帽遇到的问题
- ipad文献管理软件_使用ipad看文献,有哪些好用的工具软件?
- 使用深度学习技术进行水印去除
- 论文阅读笔记—Exploring Visual Relationship for Image Captioning
- 关于hive on spark的distribute by和group by使用以及小文件合并问题
- windows2012R2安装Microsoft Visual C++ 2015 Redistributable报错,提示0x80240017错误代码
- 基于python实现的双月模型
- Latex-插入eps图片失败解决方法“ Latex Package pdftex.def Error....”
热门文章
- CSS - 网格布局(grid)
- html5设计九宫格页面,Html5响应式设计实现九宫格,html5响应九宫格
- Android 禁止程序常驻内存,【教程】教你如何让指定APP常驻内存
- 华为nova3e支持鸿蒙系统吗,华为nova 3e值不值得买?HUAWEI nova 3e深度体验评测
- 大一怎么学好c语言_教你一招:计算机专业大一新生,如何能够有效学习 C 语言?...
- Python基金投资回测
- FISCO BCOS 联盟链Max搭建
- 国内AR技术领头羊十二居对ARKit充满期望!
- Computational and Mathematical Methods in Medicine
- 《程序设计基础》 第十章 函数与程序结构 7-1 圆形体体积计算器 (20 分)