Mipmap(有时候拼写成mipmap)是一种电脑图形图像技术,用于在
三维图像的二维代替物中达到
立体感效应。
简介
MIP来源于
拉丁文中的multum in parvo,意为在一个小空间里的多数。MIP map技术与
材质贴图技术结合,根据距观看者远近距离的不同,以不同的分辨率将单一的材质贴图以多重图像的形式表现出来并代表平面纹理:尺寸最大的图像放在前面显著的位置,而相对较小的图像则后退到背景区域。每一个不同的尺寸等级定义成一个MIP map水平。MIP map技术帮助避免了不想要的锯齿边缘(称为锯齿状图形)在图像中出现,这种锯齿状图形可能是由于在不同分辨率下使用bit map图像产生的。
机制
Mipmap是目前应用最为广泛的纹理映射技术之一。Willams将低一级图像的每边的分辨率取为高一级图像的每边的分辨率的二分之一,而同一级分辨率的纹理组则由红、绿、蓝三个分量的纹理数组组成。由于这一个
查找表包含了同一纹理区域在不同分辨率下的纹理颜色值,因此被称为Mipmap。
Mipmap可以用一个
四棱锥来描述。该四棱锥的总层数为4 ,S为初始纹理图像每边的分辨率。若最底层图像为给定的原始图像,则第二层图像可以由最底层图像与边长为2个象素的
正方形滤波器做卷积运算得到。一般的,第n层图像可以由第(n-1) 层图像与边长为2个像素的正方形滤波器做
卷积运算得到。例如,某一纹理图像的Mipmap的层数为10层,第10层图像为一个像素,它由原始图像经与边长为512个像素的正方形滤波器做卷积运算压缩得到,其分辨率为1×1。
Mipmap纹理映射在确定屏幕上每一象素内可见的平均纹理颜色时需要计算三个参数,即屏幕像素中心在纹理平面上映射点的坐标 和屏幕像素内可见表面在纹理平面上所映射的边长d。其中,取屏幕像素内可见表面在纹理平面上近似正方形映射区域的中心,d取该近似正方形的边长。显然,d决定了应该在哪一级分辨率的纹理图像平面上查找Mipmap表。
虽然我们很容易通过纹理映射变换和取景变换的
逆变换求得屏幕像素中心在纹理平面上映射点的参数坐标 ,但是d的值却不容易确定。一般而言,d的取值应使得在纹理平面上以 为中心,d为边长的正方形尽可能地覆盖屏幕像素的实际映射区域,从而可取该正方形内平均纹理颜色值作为屏幕像素实际映射区域的平均纹理颜色的
近似值。在实际处理时,可取d为屏幕像素在纹理屏幕上映射区域的最大边长。
纹理贴图
OpenGL实现了Mipmap的功能。
void glTexImage2D ( GLenum target, GLint level, GLint components, GLsizei width, glsizei height, GLint
border, GLenum format, GLenum type, const GLvoid * pixels)函数定义一个二维
纹理映射。
参数target是常数GL_TEXTURE_2D。
参数level表示多级分辨率的纹理图像的级数,若只有一种分辨率,则level设为0。参数components是一个从1到4的整数,指出选择了R、G、B、A中的哪些分量用于调整和混合,1表示选择了R分量,2表示选择了R和A两个分量,3表示选择了R、G、B三个分量,4表示选择了R、G、B、A四个分量。
参数
width和height给出了纹理图像的长度和宽度,参数border为纹理边界宽度,它通常为0,width和height必须是2m+2b,这里m是整数,长和宽可以有不同的值,b是border的值。纹理映射的最大尺寸依赖于OpenGL,但它至少必须是使用64x64(若带边界为66×66),若width和height设置为0,则纹理映射有效地关闭。
参数format和type描述了纹理映射的格式和
数据类型,参数format可以是GL_COLOR_INDEX、GL_
RGB、GL_
RGBA、GL_RED、GL_GREEN、GL_BLUE、GL_ALPHA、GL_LUMINANCE或GL_LUMINANCE_ALPHA(注意:不能用GL_STENCIL_INDEX和GL_DEPTH_COMPONENT)。类似地,参数type是GL_BYPE、GL_UNSIGNED_BYTE、GL_SHORT、 GL_UNSIGNED_SHORT、GL_
INT、GL_UNSIGNED_INT、GL_
FLOAT或GL_BITMAP。
参数pixels包含了纹理
图像数据,这个
数据描述了纹理图像本身和它的边界。
纹理映射是一个相当复杂的过程,OpenGL最基本的执行纹理映射所需的步骤主要是:(1)定义纹理glTexImage2D;(2)控制
滤波 glTexParameterf;(3)说明映射方式glTexEnvf;(4)绘制场景,给出顶点的纹理坐标和几何坐标
glEnable(GL_TEXTURE_2D)和
glTexCoord2f。纹理映射只能在
RGBA方式下执行,不能运用于颜色表方式。