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 ...
随机推荐
- centos中安装openjdk
openjdk的java环境还是简单好用,至于其他的,现在又用不到,为啥要费事安装它们? 步骤: 1.yum search java | grep jdk [root@noi ~]# yum sear ...
- Struts2使用OGNL遍历各种map总结
一.Action中的代码:MapAction.java package com.zx.demo.action; import java.util.ArrayList; import java.ut ...
- boost 库的安装
一.windows下 环境:win7 64位 方法1:使用.exe类型的boost进行安装,也就是编译过得,这种方法最简单.下载后直接执行.exe就行了. http://sourceforge.net ...
- 基于js全屏动画焦点图幻灯片
今天给大家分享一款基于js全屏动画焦点图幻灯片.这款焦点图内的内容以动画形式出现和消失.效果图如下: 在线预览 源码下载 实现的代码. html代码: <div class="sl ...
- android版本号始终为1
之前用Eclipse里时,版本号是检查是做如下 <manifest xmlns:android="http://schemas.android.com/apk/res/android& ...
- Maven实战(插件管理)
1.前言 近期在做项目中,用到了Maven来管理项目,当理解了Maven的基础知识后,忽然看到好多的插件信息,所以在此总结一下.其有使用方法基本上都一样. 2.源码打包插件 我们能够在Apache的站 ...
- linux -- camera shot 拍照功能
#include <stdio.h> #include <string.h> #include <errno.h> #include <stdlib.h> ...
- Tomcat性能优化(二) 启动参数设置
一.tomcat绿色版设置方法 进入tomcat/bin目录下,找到catalina.bat文件在文件首行中插入下面这段配置即可. set JAVA_OPTS=-server -Djava.awt.h ...
- 关于HTTP的长连接和短连接
1. HTTP协议与TCP/IP协议的关系 HTTP的长连接和短连接本质上是TCP长连接和短连接.HTTP属于应用层协议,在传输层使用TCP协议,在网络层使用IP协议. IP协议主要解决网络路由和寻址 ...
- sql row_number 用法
自己研究了一下RowNum ,发现这样的分页挺清晰的 --第几页,一页多少行declare @PageIndex int,@PageMax intset @PageIndex =1set @PageM ...