提取图片纹理_Fundamentals Of Computer Graphics 第十一章 纹理映射(中)
本文翻譯虎書第十一章紋理映射的11.3部分
11.3 抗鋸齒紋理查詢
紋理映射的第二個基本問題是抗鋸齒。渲染紋理映射的圖像是一個采樣過程:將紋理映射到表面上,然后將表面投影到圖像中,將在整個圖像平面上產生2D函數,我們以像素為單位對其進行采樣。就像我們在第9章中看到的那樣,當圖像包含細節或銳利邊緣時,使用點樣本執行此操作會產生鋸齒失真-并且由于紋理的整個點都要引入細節,因此它們成為像我們在圖11.3中看到的鋸齒問題的主要來源。
就像線條或三角形的抗鋸齒光柵化,抗鋸齒光線跟蹤(參見第13.4節)或對圖像進行降采樣(參見第9.4節)一樣,解決方案是使每個像素不是點樣本,而是圖像面積的平均值,區域類似像素的大小。使用用于抗鋸齒光柵化和光線跟蹤的相同超級采樣方法,如果有足夠的樣本,則可以在不更改紋理映射機制的情況下獲得出色的結果:像素區域內的許多樣本將落在紋理圖中的不同位置,并平均使用不同紋理查找計算出的陰影結果是一種精確的方法,可以估算像素上圖像的平均顏色。但是,使用詳細的紋理需要很多樣本才能獲得良好的結果,這很慢。在表面存在紋理的情況下,高效地計算該面積平均值是紋理抗鋸齒的第一個重要的主題。
紋理圖像通常由光柵圖像定義,因此,與升采樣圖像一樣,也要考慮重采樣問題(參見第9.4節)。解決方案同樣可以運用在紋理上:使用重采樣濾波在紋理像素之間進行插值。
在以下各節中,我們將對每個主題進行擴展
11.3.1 一個像素的覆蓋區
使抗鋸齒紋理比其他類型的抗鋸齒更為復雜的原因在于,渲染圖像與紋理之間的關系不斷變化。每個像素值都應計算為圖像中屬于像素的區域的平均顏色,在通常情況下,像素對應單個表面,這相當于對表面上的區域求平均。 如果表面顏色來自紋理,則依次對紋理的相應部分進行取平均,這稱為像素的紋理空間覆蓋區。 圖11.18說明了正方形區域(可能是較低分辨率圖像中的像素區域)覆蓋區如何映射到地板紋理空間中大小和形狀完全不同的區域
圖11.18 圖像中相同大小的正方形區域在紋理空間中的覆蓋區的大小和形狀都不同。回憶一下使用紋理進行渲染所涉及的三個空間:將3D點映射到圖像中的投影π和將3D點映射到紋理空間中的紋理坐標函數
。為了處理像素覆蓋區,我們需要了解這兩個映射的組合:首先向后跟隨π,從圖像到表面,然后向前跟隨 。組合 決定了像素覆蓋區:像素覆蓋區是圖片在 映射下的像素的方形區域紋理抗鋸齒的核心問題是計算像素覆蓋區上紋理的平均值。通常,要精確地做到這一點可能是一件相當復雜的工作:對于一個具有復雜表面形狀的遙遠物體,覆蓋區可能在紋理空間中覆蓋了大面積的復雜的形狀,或者可能是幾個不連續的區域。但是在典型情況下,像素落在表面的平滑區域中,該區域映射到紋理中的單個區域。
因為
既包含從圖像到表面的映射,又包含從表面到紋理的映射,所以覆蓋區的大小和形狀取決于觀察情況和紋理坐標函數。當表面更靠近相機時,像素覆蓋區會更小;當同一表面移得更遠時,占地面積會更大。當以傾斜角度觀察表面時,像素在表面上的覆蓋區會變長,這通常意味著它在紋理空間中也會變長。即使使用固定的視圖,紋理坐標函數也會導致覆蓋區變化:如果覆蓋區變形,則覆蓋區的大小也會發生變化;如果變形,則即使是俯視圖也可以將其拉長。但是,為了找到一個用于計算抗鋸齒查詢的高效算法,需要一些近似值。
圖 11.19 可以使用從(x,y)到(u,v)的映射的導數來近似像素的紋理空間覆蓋區。 x和y的偏導數與x和y等值線的圖像平行(藍色),并跨過一個平行四邊形(橙色陰影),近似于精確輪廓線的彎曲形狀(黑色輪廓)當一個函數是平滑的,一個線性近似值通常是有用的。對于紋理抗鋸齒的情況,這意味著從圖片空間到紋理空間的
映射被近似看作一個從2D到2D的映射: 是一個2X2的,有些類似 的導數的矩陣。如果我們表示圖片空間的 點和紋理空間的 點,他就是這四個導數描述了紋理坐標
是如何隨著一個在圖片中的點 變化而變化的。這種近似的幾何解釋是,它表示圖像中以x為中心的單位大小的正方形像素區域將近似映射到紋理空間中以
為中心且其邊緣與矢量 和 平行的平行四邊形中。導數矩陣
很有用,因為它講述了整個圖像(近似)紋理空間覆蓋區變化的整個過程。數量較大的導數表示較大的紋理空間覆蓋區,并且導數向量 和 之間的關系表示形狀。當它們正交且長度相同時,覆蓋區為正方形,并且它們變得偏斜和/或長度相差很大,覆蓋區將會被拉長。現在,我們已經得到了通常被認為是這種形式問題的“正確答案”:在特定圖像空間位置處過濾的紋理樣本應該是此點紋理坐標導數定義的平行四邊形形狀輪廓上的紋理貼圖的平均值。這已經有了一些假設,即從圖像到紋理的映射是平滑的,但是對于獲得出色的圖像質量來說它是足夠準確的。但是,該平行四邊形面積平均值已經太昂貴而無法精確計算,因此使用了各種近似值。紋理抗鋸齒的方法在逼近此查找時在速度/質量折衷方面有所不同。我們將在以下各節中討論這些
11.3.2 重采樣
當覆蓋區小于紋理像素時,我們會將紋理映射到圖像中時將其放大。 這種情況類似于對圖像進行上采樣,并且主要考慮因素是在紋理像素之間進行插值以生成平滑的圖像,其中紋理像素網格不明顯。 就像在圖像上采樣中一樣,此平滑過程由重建濾波器定義,該重采樣濾波器用于計算紋理空間中任意位置的紋理樣本。(參見圖11.20。)
圖11.20 紋理過濾中的主要問題隨覆蓋區大小而變化。 對于覆蓋區(左),需要在像素之間進行插值以避免塊狀失真; 對于大覆蓋區,挑戰在于有效地找到許多像素的平均值注意事項與圖像重采樣幾乎相同,但有一個重要區別。在圖像重采樣中,任務是在規則的網格上計算輸出樣本,并且在可分離的重采樣濾波器的情況下,這種規則性實現了重要的優化。在紋理過濾中,查找模式不規則,必須分別計算樣本。這意味著大型高質量的重建濾波器使用起來非常昂貴,因此,通常用于紋理的最高質量濾波器就是雙線性插值。
雙線性插值紋理樣本的計算與計算通過雙線性插值上采樣的圖像中的一個像素相同。首先,我們根據紋理像素坐標(實值)表示紋理空間采樣點,然后讀取四個相鄰紋理像素的值并取其平均值。紋理通常在單位平方上進行參數設置,并且紋理像素的位置與任何圖像中的像素相同,在
方向上以 的間隔和在 中以 的間隔放置,紋素(0,0)被插入到邊緣半個紋理像素處以保持對稱.(有關完整說明,請參見第9章。)Color tex_sample_bilinear(Texture t, float u, float v) {u_p = u * t.width - 0.5v_p = v * t.height - 0.5iu0 = floor(u_p); iu1 = iu0 + 1iv0 = floor(v_p); iv1 = iv0 + 1a_u = (iu1 - u_p); b_u = 1 - a_ua_v = (iv1 - v_p); b_v = 1 - a_vreturn a_u * a_v * t[iu0][iv0] + a_u * b_v * t[iu0][iv1] +b_u * a_v * t[iu1][iv0] + b_u * b_v * t[iu1][iv1] }在許多系統中,此操作成為重要的性能瓶頸,主要是因為從紋理數據中獲取四個紋素值涉及到內存延遲。紋理的采樣點的模式是不規則的,因為從圖像到紋理空間的映射是任意的,但通常是連貫的,因為附近的圖像點傾向于映射到可能讀取相同紋理像素的附近紋理點。因此,高性能系統具有專門用于紋理采樣的特殊硬件,該硬件可處理插值并管理最近使用的紋理數據的緩存,以最大程度地減少從存儲紋理數據的內存中提取慢速數據的次數。
閱讀第9章后,您可能會抱怨線性插值對于某些要求苛刻的應用程序可能不夠平滑。但是,始終可以通過使用更好的濾波器將紋理重新采樣到更高的分辨率來使其足夠好,從而使紋理足夠平滑以至于雙線性插值效果良好。
11.3.3 多級漸遠紋理
僅在放大紋理的情況下做好插值就足夠了:像素占位面積比紋理像素間距小。當像素覆蓋區覆蓋許多紋理像素時,良好的抗鋸齒功能需要計算許多紋理像素的平均值以平滑信號,以便可以對其進行安全采樣。
一種計算覆蓋區上的平均紋理值的非常準確的方法是找到覆蓋區中的所有紋理像素并將其相加。但是,當占用空間很大時,這可能會非常昂貴-僅一次查找就可能需要讀取數千個紋素。更好的方法是在不同大小和位置的各個區域上預先計算并存儲紋理的平均值。
這個想法的一個非常流行的版本被稱為“MIP映射”或mipmapping。Mipmap是一系列紋理,這些紋理均包含相同的圖像,但分辨率越來越低。原始的全分辨率紋理圖像稱為mipmap的基本級別或級別0,而級別1則是通過獲取該圖像并將其在每個維度中降采樣2倍而生成的,從而得到具有像素數量的四分之一。大致來說,此圖像中的紋素是0級圖像中面積為2乘2紋素的正方形區域的平均值。
可以繼續進行此過程,以定義所需的任意多個mipmap級別:通過對k級圖像進行降采樣2倍來計算k - 1級圖像。級別k的紋素對應于原始紋理中面積為
紋素的正方形區域。例如,從1024×1024紋理圖像開始,我們可以生成具有11個級別的mipmap:0級為1024×1024;級別1為512×512,依此類推,直到級別10,只有一個紋理像素。這種具有以一系列越來越低的采樣率表示相同內容的圖像的結構,被稱為圖像金字塔,其基于將所有較小圖像堆疊在原始圖像頂部的視覺隱喻。11.3.4 使用Mipmap進行基礎的紋理濾波
使用mipmap或圖像金字塔,與單獨訪問許多紋理像素相比,可以更有效地完成紋理過濾。當我們需要在大面積上平均的紋理值時,我們只使用來自更高級別的mipmap的值,這些值已經是圖像大面積上的平均值。最簡單,最快的方法是從mipmap查找單個值,然后選擇級別,以使該級別上的紋素覆蓋的大小與像素覆蓋區的整體大小大致相同。當然,像素覆蓋區的形狀可能與紋素表示的(始終為正方形)區域的形狀完全不同,我們可以預期會產生一些失真。
暫時擱置一個問題,當像素覆蓋區具有拉長的形狀時該怎么做,假設覆蓋區是寬度D的平方,以全分辨率紋理中的像素表示。哪個級別的mipmap適合采樣?由于第k級的紋理像素覆蓋了寬度為
的正方形,因此選擇k所以我們讓
。當然,這在大多數情況下會給出k的非整數值,并且我們只存儲了整數級別的mipmap圖像。 兩種可能的解決方案是,僅針對最接近k的整數查找值(高效,但會在級別之間的突然過渡處產生接縫),或者查找針對k的兩個最接近整數的值并線性插值(兩次,但更流暢)。在我們實際寫下對mipmap進行采樣的算法之前,我們必須決定當覆蓋區不是正方形時如何選擇“寬度”D。 一些可能的方法是使用面積的平方根或找到覆蓋區的最長軸并將其稱為寬度。易于計算的實際折衷方法是使用最長邊的長度:Color mipmap_sample_trilinear(Texture mip[], float u, float v,matrix J) {D = max_column_norm(J)k = log2(D)k0 = floor(k); k1 = k0 + 1a = k1 - k; b = 1 - ac0 = tex_sample_bilinear(mip[k0], u, v)c1 = tex_sample_bilinear(mip[k1], u, v)return a * c0 + b * c1 }基本的mipmapping可以很好地消除鋸齒,但是由于它無法處理細長的或各向異性的像素覆蓋區,因此在以掠射角度查看表面時效果不佳。在代表觀察者站立的表面的大平面上最常見。 可以以非常陡峭的角度觀察地板上較遠的點,從而產生非常各向異性的覆蓋區,該覆蓋區在較大的正方形區域內會發生映射。生成的圖像將在水平方向上顯得模糊。
11.3.5 各向異性濾波
Mipmap可以與多個查詢一起使用,以更好地近似伸長的覆蓋區。 這個想法是根據覆蓋區的最短軸而不是最大軸選擇mipmap級別,然后將沿長軸間隔的幾個查找平均在一起。(見圖11.21。)
圖11.21 使用三種不同策略對具有挑戰性的測試場景進行抗鋸齒的結果(參考圖像左側顯示了詳細的結構):簡單地通過最近鄰插值獲取單個點樣本; 使用mipmap金字塔對每個像素的紋理中的正方形區域求平均; 使用來自mipmap的幾個樣本來平均紋理中的各向異性區域。總結
以上是生活随笔為你收集整理的提取图片纹理_Fundamentals Of Computer Graphics 第十一章 纹理映射(中)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: U盘或者光盘安装法台式电脑光盘如何安装
- 下一篇: 笔记本更换固态硬盘不求人想给笔记本换个固