OpenGL纹理映射总结

Posted 阳春白雪

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了OpenGL纹理映射总结相关的知识,希望对你有一定的参考价值。

1.纹理对象:

使用纹理对象来存储纹理数据的步骤:

1) 生成纹理对象名称
2) 将纹理对象绑定到纹理数据(包括图像数据数组和纹理属性), 即创建纹理对象.
3)
如果OpenGL实现高性能纹理工作集, 应检查是否有足够的空间来存储所有的纹理对象. 如没有足够空间, 应设置每个纹理对象的优先级,
以确保最常用的纹理留在工作集中
4) 绑定和重新绑定纹理对象, 以便可以将其中的纹理映射到物体上.

2.生成纹理对象名称:

void glGenTextures(GLsizei n, GLint* textureNames);

功能: 通过数组textureNames返回n个未用的纹理对象名, 返回的名称不必是相邻的整数.

GLboolean glIsTexture(GLint textureName);

功能: 如textureName是已被绑定的纹理对象名, 且没有被删除, 则返回GL_TRUE, 如textureName为0, 或非0,
但不是已有纹理对象的名称, 返回GL_FALSE。

注:若glGenTextures()返回, 但未使用glBindTextures()绑定, 仍返回GL_FALSE

3.创建和使用纹理对象:

void glBindTexture(GLenum target, GLuint textureName);

功能: 完成下面几项工作.

1) 如textureName为非零无符号整数, 首次被使用, 则创建一新的纹理对象, 并将其名称设置为参数textureName的值.

2) 绑定一个已创建的纹理对象时, 该纹理对象将进入活动状态

3) 如textureName为0, OpenGL将停止使用纹理对象, 返回到未命名的默认纹理

4) 首次被创建时, target指定了维数, 其取值为GL_TEXTURE_1D, GL_TEXTURE_2D, GL_TEXTURE_3D 或
GL_TEXTURE_CUBE_MAP.

5) 首次被创建时, 诸如缩小滤波方法, 放大滤波方法, 环绕模式, 边框颜色, 纹理优先级等纹理属性被设置为默认值.

纹理驻留策略:

如果有多个使用周期较短且大小相同的纹理, 可以调用函数glTexSubImage*()将不同的图像加载到已有的纹理对象中,与删除并重新创建纹理对象相比, 这样做的效率可能更高

void glPrioritiesTextures(GLsizei n, const GLuint *textureNames, const
GLclampf *priorities);

功能: 将n个纹理对象的优先级设置为指定的值, 数组textureNames指定了这些纹理对象的名称, 数组priorities指定了优先级.

priorities: 指定了优先级, 将其值截取到[0.0, 1.0], 0对应的优先级最低, 1对应的优先级最高

函数glPrioritiesTextures()步要求textureNames中指定的纹理对象被绑定过.

函数glTexParameter*()也可用于设置单个纹理对象的优先级. 但仅限于当前绑定的纹理对象.

4.纹理函数:

void glTexEnv(if)(GLenum target, GLenum pname, TYPE param);
void glTexEnv(if)v(GLenum target, GLenum pname, TYPE* param);

功能: 设置当前的纹理映射方式.

target: 必须为GL_TEXTURE_FILTER_CONTROL或GL_TEXTURE_ENV

pname: 如target为GL_TEXTURE_FILTER_CONTROL, pname必须为GL_TEXTURE_LOD_BIAS.

       如target为GL_TEXTURE_ENV, pname可为GL_TEXTURE_ENV_MODE,
GL_TEXTURE_ENV_COLOR

param: 如pname为GL_TEXTURE_LOD_BIAS, param是一个浮点数, 用于指定GL_TEXTURE_LOD_BIAS的值.

      
如pname为GL_TEXTURE_ENV_MODE,param的取值为GL_DECAL,GL_REPLACE,GL_MODULATE,GL_BLEND,
GL_ADD或GL_COMBINE. 指定了如何将纹理值和片元的颜色值合并起来.

如pname为GL_TEXTURE_ENV_COLOR, 则参数pname是一个包含4个浮点数的数组, 这4个元素分别是R, G, B, A分量,
指定了一种用于GL_BLEND操作的颜色.

纹理映射方式和基本内部结构一起决定了如何应用纹素数据的各个分量

纹理映射方式作用于被选择的纹素数据分量和片元的颜色值.

5.指定纹理坐标:

纹理坐标可包含1-4个分量, 这些分量通常被称为s, t, r和q坐标.
一维纹理, 使用s坐标. 二维纹理, 使用s和t坐标, 三维纹理, 使用s,
t和r坐标. q坐标通常被设置为1, 用于创建齐次坐标.
void glTexCoord[1234][sifd](TYPE
coords);
void glTexCoord[1234][sifd]v(TYPE* coords);

功能: 设置当前的纹理坐标(s,t,r,q),

计算合适的纹理坐标

由于映射的格式与纹理格式不符,容易造成扭曲的情况,这次要选择恰当的纹理坐标来映射

纹理的重复和截取

纹理坐标被指定为范围[0, 1]之外的值时, 将截取纹理坐标或重复纹理图像

也可以使用环绕模式"镜像(mirrored)"重复, 重复时翻转纹理图像

例如: 在纹理坐标范围[0,1]内,俺原来顺序使用纹理数据, [1, 2]则相反顺序使用纹理数据, [2, 3]又按原来的顺序使用, 依次类推

另一种环绕模式是截取纹理坐标: 将大于1.0的坐标设置为1.0, 将小于0.0的坐标设置为0.0.

如何使用纹理边框颜色:

1) 如果环绕模式为GL_REPEAT, 总是忽略边框. 从对侧选择一个2X2纹素阵列来计算加权平均.

2) 如果环绕模式为GL_CLAMP, 将边框纹素(或GL_TEXTURE_BORDER_COLOR的值)用于计算2X2加权平均

3) 如果环绕模式为GL_CLAMP_TO_EDGE, 总是忽略边框. 使用纹理边缘或靠近纹理边缘的纹素被用于纹理计算, 但不使用边框上的纹素.

4) 如果环绕模式为GL_CLAMP_TO_BORDER, 纹理坐标超出了范围[0, 1], 则只使用边框纹素(如果没有边框,
使用边框常量颜色)来计算纹理映射.

 6.自动生成纹理坐标:

void glTexGen[ifd](GLenum coord, GLenum pname, TYPE param);

void glTexGen[ifd]v(GLenum coord, GLenum pname, TYPE *param);

 功能: 指定用于自动生成纹理坐标的函数(function).

coord: 必须是GL_S, GL_T, GL_R, GL_Q. 指出生成s, t, r还是q纹理坐标

pname: 为GL_TEXTURE_GEN_MODE, GL_OBJECT_PLANE, GL_EYE_PLANE

param: 如pname为GL_TEXTURE_GEN_MODE, param为一个整数, 取值为GL_OBJECT_LINEAR, GL_EYE_LINEAR, GL_SPHERE_MAP, GL_REFLECTION_MAP, GL_NORMAL_MAP

pname为其他值, param是一个指向数组的指针(向量版本), 数组中包含提供给纹理生成函数的参数值.

纹理图像映射到固体物体上, 使用物体坐标指定参考较合适. GL_OBJECT_LINEAR.

移动的物体上生成动态的等高线时, 使用眼坐标GL_EYE_LINEAR较合适.

球形环境映射用GL_SPHERE_MAP较合适.

立方图用GL_NORMAL_MAP.

 

 

 

 

 

 

 

 

 

 

 

 

以上是关于OpenGL纹理映射总结的主要内容,如果未能解决你的问题,请参考以下文章

opengl 把纹理映射到立方体的六个面。

opengl使用bmp纹理映射画不出东西

Opengl 纹理映射和图像分辨率

OpenGL ES纹理

opengl 纹理映射

OpenGL 纹理未正确映射