看了关于纹理坐标的但是感觉都没有说清楚 特整理如下:
http://blog.sina.com.cn/s/blog_62dfaf550100g2l1.html
http://blog.sina.com.cn/s/blog_62dfaf550100g2y4.html
纹理坐标定义
在绘制纹理映射场景时,不仅要给每个顶点定义几何坐标,而且也要定义纹理坐标。经过多种变换后,几何坐标决定顶点在屏幕上绘制的位置,而纹理坐标决定纹理图像中的哪一个纹素赋予该顶点。并且顶点之间的纹理坐标插值与基础篇中所讲的平滑着色插值方法相同。
纹理图像是方形数组,纹理坐标通常可定义成一、二、三或四维形式,称为s,t,r和q坐标,以区别于物体坐标(x, y, z, w)和其他坐标。一维纹理常用s坐标表示,二维纹理常用(s, t)坐标表示,目前忽略r坐标。q坐标像w一样,一般情况下其值几乎均为1,主要用于建立齐次坐标。OpenGL坐标定义的函数是:
void gltexCoord{1234}{sifd}[v](TYPE coords);
设置当前纹理坐标,此后调用glVertex*()所产生的顶点都赋予当前的纹理坐 标。对于gltexCoord1*(),s坐标被设置成给定值,t和r设置为0,q设置为1;用gltexCoord2*()可以设置s和t坐标值,r设 置为0,q设置为1;对于gltexCoord3*(),q设置为1,其它坐标按给定值设置;用gltexCoord4*()可以给定所有的坐标。使用适 当的后缀(s,i,f或d)和TYPE的相应值(GLshort、GLint、glfloat或GLdouble)来说明坐标的类型。注意:整型纹理坐标可以直接应用,而不是象普通坐标那样被映射到[-1, 1]之间。
1. 创建纹理图像
glGenTextures(1,@Texture);
glBindTexture(GL_TEXTURE_2D,Texture);
glGenTextures和glBindTexture函数用于创建和绑定纹理对象,glTexImage2D函数将Pixels数组中的像素值传给当前绑定的纹理对象,于是便创建了纹理。glTexImage函数的参数分别是纹理的类型,纹理的等级,每个像素的字节数,纹理图像的宽度和高度,边框大小,像素数据的格式,像素值的数据类型,像素数据。
2. OpenGL中的贴图方式
OpenGL为我们提供了三种纹理——GL_TEXTURE_1D、GL_TEXTURE_2D和GL_TEXTURE_3D。它们分别表示1维纹理、2维纹理和3维纹理。无论是哪一中纹理,使用方法都是相同的:即先创建一个纹理对象和一个存储纹理数据的n维数组,在调用glTexImageN D函数来传入相应的纹理数据。除此之外,我们可以一些函数来设置纹理的其他特性。
2.1 设置贴图模式
glTexEnvi(GL_TEXTURE_ENV,GL_TEXTURE_ENV_MODE,TextureMode);
GL_MODULATE,GL_DECAL和GL_BLEND中的任何一种。
glTexEnvfv(GL_TEXUTRE_ENV,GL_TEXTURE_ENV_COLOR,@ColorRGBA);
2.2 纹理滤镜
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILETER, MagFilter);//设置放大滤镜
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER, MinFilter); //设置缩小滤镜
表6.3-1 可使用的纹理滤镜 | |
滤镜 | 描述 |
GL_NEAREST | 取最邻近像素 |
GL_LINEAR | 线性内部插值 |
GL_NEAREST_MIPMAP_NEAREST | 最近多贴图等级的最邻近像素 |
GL_NEAREST_MIPMAP_LINEAR | 在最近多贴图等级的内部线性插值 |
GL_LINEAR_MIPMAP_NEAREST | 在最近多贴图等级的外部线性插值 |
GL_LINEAR_MIPMAP_LINEAR | 在最近多贴图等级的外部和内部线性插值 |
3 纹理映射
3.1 纹理坐标
函数即可。其中,s、t是对于2D纹理而言的s、t坐标。对于任何纹理,它的纹理坐标都如同下图所示(对于iOSGLKTextureInfo 默认参数而言!!!)的那样:
iOS GLKTextureInfo 默认 纹理S坐标 从左到右0-1 纹理T坐标从下到上0-1
这里的坐标由:
GLKTextureInfo 中
GLKTextureInfo *textureInfo = [GLKTextureLoadertextureWithContentsOfFile:filePathoptions:optionserror:nil];
默认值为 所以对于iOS 中
GLKTextureInfo 默认的纹理坐标是 T坐标从下到上为0-1 S坐标为从左至右为0-1
GL_TEXTURE_WRAP_S / GL_TEXTURE_WRAP_T: GL_CLAMP_TO_EDGE
Any texture parameter not specified above will be set to OpenGL's default value.
glTexParameter*()函数的参数 |
参数(pname) | 值(param) | |||||||
GL_TEXTURE_WRAP_S 从左至右纹理环绕模式 GL_TEXTURE_WRAP_T 从下至上纹理环绕模式 GL_TEXTURE_WRAP_R 从里至外纹理环绕模式 | GL_CLAMP:截取 GL_REPEAT:重复 GL_MIRRORED_REPEAT:镜像重复 GL_CLAMP_TO_EDGE:忽略边框截取 GL_CLAMP_TO_BORDER:代边框的截取 | |||||||
GL_TEXTURE_MAG_FILTER | GL_NEAREST或GL_LINEAR | |||||||
GL_TEXTURE_MIN_FILTER | GL_NEAREST 速度快,效果差 GL_LINEAR 计算量大。效果好 GL_NEAREST_MIPMAP_NEAREST 速度快,效果差 GL_LINEAR_MIPMAP_NEAREST GL_NEAREST_MIPMAP_LINEAR GL_LINEAR_MIPMAP_LINEAR 计算量大。效果好 | |||||||
GL_TEXTURE_BORDER_COLOR | ||||||||
GL_TEXTURE_PRIORITY | (0,1)纹理优先级 | |||||||
GL_TEXTURE_BASE_LEVEL | 浮点值 | |||||||
GL_TEXTURE_MAX_LEVEL | 浮点值 | |||||||
GL_TEXTURE_MIN_LOD | 浮点值 | |||||||
GL_TEXTURE_MAX_LEVEL | 浮点值 | |||||||
GL_TEXTURE_LOD_BIAS | ||||||||
GL_TEXTURE_COMPARE_MODE 纹理比较模式 | GL_COMPARE_R_TO_TEXTURE 深度比较 | |||||||
GL_DEPTH_TEXTURE_MODE | GL_RED:R GL_LUMINANCE:亮度 GL_INSENSITY GL_ALPHA:A | |||||||
GL_TEXTURE_COMPARE_FUNC 纹理比较方式 | GL_LEQUAL,GL_GEQUAL,GL_LESS,GL_GREATER,GL_EQUAL, GL_NOTEQUAL,GL_ALWAYS,GL_NEVER | |||||||
GL_GENERATE_MIAMAP 自动生成多重细节层 | GL_TRUE,GL_FALSE |
3.2 纹理缠绕
|
|
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_S,WrapMode);//在s方向上的缠绕方式
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_T,WrapMode);//在t方向上的缠绕方式
4.纹理对象
创建和使用文理对象
var Texture:GLUint;
...
删除纹理对象
5. 多贴图纹理
glTexImage2D(GL_TEXTURE_2D,0,3,8,8,0,GL_RGB,GL_UNSIGNED_BYTE,Pixels);
glTexImage2D(GL_TEXTURE_2D,1,3,4,4,0,GL_RGB,GL_UNSIGNED_BYTE,Pixels);
glTexImage2D(GL_TEXTURE_2D,2,3,2,2,0,GL_RGB,GL_UNSIGNED_BYTE,Pixels);
glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR_MIPMAP_LINEAR);