Mipmap

Mipmap

Mipmap(有時候拼寫成mipmap)是一種電腦圖形圖像技術,用於在三維圖像的二維代替物中達到立體感效應。

簡介


MIP來源於拉丁文中的multum in parvo,意為在一個小空間里的多數。MIP map(有時候拼寫成mipmap)是一種電腦圖形圖像技術,用於在三維圖像的二維代替物中達到立體感效應。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方式下執行,不能運用於顏色表方式。