OpenGL编程指南第九章:纹理映射
转自://http://blog.csdn.net/longhuihu/article/details/8477614
纹理(texture)是一块矩形数据序列,存储的数据为颜色、亮度、alpha值。纹理数据的每个单位叫做texel,纹理数据可以被映射到任何几何形状的表面。
1、纹理映射基础
使用纹理是一个相对复杂的操作,一般需要以下几个步骤:
1、创建texture对象,并指定数据:
纹理数据可以是二维的图像,也可以是一维或三维的;
2、指定texture将被以何种方式与像素进行映射:
有四种函数可以用于对fragment color和texture color进行计算,一是直接使用纹理颜色进行替换,二是用纹理颜色对fragment颜色进行模运算,三是进行scale运算,四是依据纹理值,用一个颜色常量与fragment进行混合;
3、激活像素映射功能:
调用glEnable()函数来激活,参数可以是GL_TEXTURE_1D,GL_TEXTURE_2D,GL_TEXTURE_3D,GL_TEXTURE_CUBE_MAP,分别激活一维、二维、三维、立体纹理,如果先后激活多个那个生效的是较大维数的;
4、绘制场景,指定几何坐标和纹理坐标:
就像为顶点指定颜色一样,为对应顶点指定纹理坐标,对二维的纹理来说,坐标就是一对0~1的浮点数。就像颜色的flat shade一样,几何顶点之间的纹理坐标自动进行插值计算。这样,顶点之外的部分,纹理坐标超出了[0,1],其计算方式需要你来指定:重复,剪切...。2\
2、纹理数据
为纹理指定数据的api是glTexImage2D(GLenum target, GLint level, GLint internalFormat,GLsizei width, GLsizei height, GLint border,GLenum format, GLenum type, const GLvoid *texels);
taget:GL_TEXTURE_2D等常量
level:当你准备为同一纹理对象,提供多个分辨率的版本,level值派上用场。否则设为0即可
internalFormat:指定了纹理元素的数据成员,比如GL_RBGA,GL_ALPHA
width,height,border:指定了纹理的尺寸、边宽,OpenGL2.0以前,width和height必须是2的指数
format,type:传入数据的格式,类型,与glDrawPixels一致
可以直接读取frameBuffer数据作为纹理glCopyTexImage2D(GLenum target, GLint level,GLint internalFormat, GLint x, GLint y,GLsizei width, GLsizei height, GLint border);
GLint internalFormat, GLint x, GLint y,GLsizei width, GLsizei height, GLint border);
x,y:欲读取frameBuffer的坐标,其他参数与glTexImage2D相同
修改现有纹理对象的数据比重新创建纹理对象的代价要低,glTexSubImage2D(GLenum target, GLint level, GLint xoffset,GLint yoffset, GLsizei width, GLsizei height,
GLenum format, GLenum type,const GLvoid *texels);
xOffset,yOffset:为目标纹理的坐标
glCopyTexSubImage2D与glTexSubImage2D功能类似,数据来自framebuffer。
纹理可以以压缩形式存储,或直接从压缩的模式加载。
判断纹理是否压缩:glGetTexLevelParameteriv(GL_TEXTURE_2D, GL_TEXTURE_COMPRESSED,BOOL &compressed);
纹理的压缩模式OpenGL并没有做规定,具体的实现会定义,加载压缩纹理glCompressedTexImage*D()
3、Mipmaps
GL_TEXTURE_BASE_LEVEL:最大尺寸的level限制;
GL_TEXTURE_MAX_LEVEL:最小尺寸的mipmap level限制;通过这两个值可以减少需要提供的mipmap
4、过滤
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER,GL_NEAREST):蒋纹理缩小滤镜设置为GL_NEAREST;
5、纹理对象管理
6、纹理函数
7、纹理坐标
void glTexGen{ifd}(GLenum coord, GLenum pname, TYPE param);
void glTexGen{ifd}v(GLenum coord, GLenum pname, const TYPE *param);
void glTexGen{ifd}v(GLenum coord, GLenum pname, const TYPE *param);
pname:GL_TEXTURE_GEN_MODE, GL_OBJECT_PLANE, or GL_EYE_PLANE,GL_TEXTURE_GEN_MODE指定产生坐标的方式,值可以是GL_OBJECT_LINEAR, GL_EYE_LINEAR, GL_SPHERE_MAP,GL_REFLECTION_MAP, or GL_NORMAL_MAP;GL_OBJECT_PLANE和GL_EYE_PLANE则提供一个参考平面。
8、Multitexturing
9、纹理组合函数
接第六节,在使用单个或多个纹理单元时,纹理组合函数可以灵活控制fragment和纹理颜色的组合。组合函数可以操作3来源的颜色或alpha值进行计算,产生一个输出值。在使用多个纹理单元时,组合函数就形成了一个流水线。
10、secondary color
11、Point Sprites
12、Texture Matrix
13、Depth Texture
OpenGL编程指南第九章:纹理映射的更多相关文章
- Opengl编程指南第二章:状态管理、几何绘图
//http://blog.csdn.net/longhuihu/article/details/7701874 1.绘图基础 清除窗口 glClearColor(0.0, 0.0, 0.0, 0.0 ...
- [转]OpenGL编程指南(第9版)环境搭建--使用VS2017
1.使用CMake Configure中选择VS2017 Win64 , Finish: 点击Generate. 2.进入build目录 打开GLFW.sln , 生成解决方案. 打开vermilio ...
- OpenGL编程指南(第七版)
OpenGL编程指南(第七版) 转自:http://blog.csdn.net/w540982016044/article/details/21287645 在接触OpenGL中,配置显得相当麻烦,特 ...
- VS15 openGL 编程指南 配置库 triangle例子
最近去图书馆借了一本书<OpenGL编程指南(原书第八版)>,今天倒腾了一天才把第一个例子运行出来. 所以,给大家分享一下,希望能快速解决配置问题. 一.下载需要的库文件 首先,我们需要去 ...
- 编译opengl编程指南第八版示例代码通过
最近在编译opengl编程指南第八版的示例代码,如下 #include <iostream> #include "vgl.h" #include "LoadS ...
- Knockout应用开发指南 第九章:高级应用举例
原文:Knockout应用开发指南 第九章:高级应用举例 1 Contacts editor 这个例子和微软为演示jQuery Data Linking Proposal例子提供的例子一样的提供的 ...
- Java编程思想 第九章 接口
第九章 接口 抽象类和抽象方法 抽象:从具体事物抽出.概括出它们共同的方面.本质属性与关系等,而将个别的.非本质的方面.属性与关系舍弃,这种思维过程,称为抽象. 这句话概括了抽象的概念,而在Java中 ...
- OpenGL编程指南(第九版) Tiangles 学习笔记
////////////////////////////////////////////////////////////////////////////// // // Triangles.cpp / ...
- opengl编程指南
第一章 opengl简单介绍 1.1 什么是opengl opengl是图形硬件的一种软件接口. 1>渲染(rendering)是计算机依据模型创建图像的过程. 2>模型(m ...
随机推荐
- Path相关方法解说(二)
今天咱们一起来看看Path里 XXXTo 相关的一类方法. watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/4 ...
- Linux下C语言的调试
调试是每个程序员都会面临的问题. 如何提高程序员的调试效率, 更好更快地定位程序中的问题从而加快程序开发的进度, 是大家共同面对的问题. 可能Windows用户顺口就会说出:用VC呗 :-) , 它提 ...
- oracle 存储过程学习感悟
1.跟大白话差不多 2.if...then.... else ....写的比较多 3.调用存储过程命令:execute procedure_name 4.调用存储函数命令:select '0' str ...
- 教程-Delphi中的GExperts搜索代码快捷键
Shift+Ait+S 打开搜索 Ctrl+Ait+R 打开上次搜索结果
- 2014圣诞节一款纯css3实现的雪人动画特效
在2014年的圣诞节,爱编程小编给大家分分享一款纯css3实现的雪人动画特效.该实例实现一个雪人跳动的特效,效果图如下: 在线预览 源码下载 实现的代码. html代码: <span cla ...
- sqlservler 分页的实现
转载自:http://www.cnblogs.com/FreeDong/archive/2011/09/27/2193240.html 当我们显示列表信息的时候,我们常常以分页形式显示,当然在ASP. ...
- Unix系统编程()改变信号处置:signal
Unix系统提供了两种方法来改变信号处置:signal和sigaction.这篇描述的是signal系统调用,是设置信号处理的原始API,所提供的接口比sigaction简单.另一方面,sigacti ...
- Httpclient远程调用WebService示例(Eclipse+httpclient)
package cn.com.taiji.pos.httpserver; import java.io.BufferedInputStream;import java.io.ByteArrayOutp ...
- Css三栏布局自适应实现几种方法
Css三栏布局自适应实现几种方法 自适应实现方法我们可以从三个方法来做,一个是绝对定位 ,自身浮动法 和margin负值法了,下面我们一起来看看这三个例子吧,希望例子能帮助到各位同学. 绝对定位法三栏 ...
- Python之查询美国护照状态
该程序会每隔至少1秒进行一次护照状态查询 需要修改passportNo变量为自己的护照号码. 另外需要pip install beautifulsoup4 #coding=utf-8 import r ...