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 ...
随机推荐
- 从JavaScript 数组去重看兼容性有关问题,及性能优化(摘自玉伯博客)
JavaScript 数组去重经常出现在前端招聘的笔试题里,比如: 有数组 var arr = ['a', 'b', 'c', '1', 0, 'c', 1, '', 1, 0],请用 JavaScr ...
- Javascript中window.opener的一点小总结
以前一直认为window.opener只有在window.open方法打开下的窗口才可以访问,没想到即使是a链接打开的页面的照样可以访问.window.opener指向父窗口,也就是来源窗口.可以利用 ...
- OpenCV3+Python3
OpenCV3计算机视觉Python语言实现笔记 图像处理与OpenCV Python3与OpenCV3.3 图像处理 OpenCV文摘 基于Python3 + OpenCV3.3.1的远程监控程序 ...
- Ubuntu/Debian下编译PC版的ffmpeg
1.安装git: 在命令行下执行 sudo apt-get install git-core 2.下载最新版本的ffmpeg: git clone git://source.ffmpeg.org/ff ...
- 0077 web.xml中配置Spring MVC时,Servlet-name上报Servlet should have a mapping的错误
这次是手工建立的web工程目录,在配置webapp/WEB-INF/web.xml的Spring MVC的DispatcherServlet时,在servlet-name上报错:Servlet sho ...
- 深入浅出MFC--第一章
Windows程序的生与死 当使用者按下系统菜单中的Close命令项,系统送出WM_CLOSE.通常程序的窗口函数不拦截次消息,于是DefWindowProc函数处理它.DefWindowProc收到 ...
- jsp页面和js代码中使用sessionScope获取session值
场景:有些实体对象可以放到HttpSession对象中,保正在一个会话期间可以随时获取这个对象的属性,例如可以将登录用户的信息写入session,以保证页面随时可以获取并显示这个用户的状态信息.下面以 ...
- Eclipse4.4 安装java反编译插件Eclipse Class Decompiler
一.在线安装方式: Eclipse Class Decompiler整合了眼下最好的2个Java反编译工具Jad和JD-Core,而且和Eclipse Class Viewer无缝集成.可以非常方便的 ...
- C语言 · 逆序排列
算法提高 逆序排列 时间限制:1.0s 内存限制:512.0MB 问题描述 编写一个程序,读入一组整数(不超过20个),并把它们保存在一个整型数组中.当用户输入0时,表示输入结束.然 ...
- Linux kernel 之 uart 驱动解析
uart 是一种非常之常见的总线,比如DEBUG信息输出,小数据量数据传输,485,以及蓝牙的控制,GPS,很多都是通过uart 进行数据传输并进行控制. 在Linux kernel 内部,uart ...