OpenGL Android課程六 介紹紋理過濾

2021-09-11 13:27:50 字數 3128 閱讀 9103

翻譯文

這節課,我們將介紹基本紋理過濾的不同型別和怎樣使用它們,

包括最鄰近(nearest-neighbour)過濾,雙線性(bilinear)過濾,

和使用mipmap的三線性(trilinear)過濾。

你將學習如何使紋理看起來更平滑,以及平滑帶來的缺點。

[這兒有旋轉物體]的不同方式,本課使用了其中一。

強烈建議您先閱讀opengl android課程四:介紹紋理基礎,理解紋理對映在opengl中的基本使用。

opengles中的紋理由元素陣列組成,被稱為紋素(texels),其中包含顏色和alpha值。這與顯示器相對應,顯示器由一堆畫素組成,並在每個點顯示不同的顏色。在opengl中紋理被用在三角形上並繪製到螢幕,因此這些紋理能繪製出各種各樣的尺寸和方向。opengl中的紋理過濾選項告訴它如何根據具體情況將紋理畫素過濾到裝置的畫素上。

有三種情況:

opengl允許我們為放大和縮小分配過濾器,並允許我們使用最鄰近、雙線性和三線性過濾。我們將在下面解釋這些意思。

這裡是放大和縮小的最鄰近渲染的視覺化,當您用usb連線你的android裝置時使用這個可愛的android顯示成功連線。

正如您所見,紋素現在很容易看到,因為當前乙個紋素覆蓋了很多畫素展示出來。

隨著縮小,許多紋素不能渲染到有限的畫素上,許多細節將會丟失。

當紋素值之間沒有插值時,在放大示例中,紋理的紋素清晰可見為大正方形。當使用最鄰近方式時,畫素將會分配到最鄰近的畫素。

一些塊效果仍然很明顯,但是這個看起來比之前更加平滑。那些在3d加速卡出現前玩過3d遊戲的人將會記得軟體渲染遊戲和硬體加速遊戲之間的特性:軟體渲染遊戲根本沒有進行預計算處理,所以一切都顯示得塊狀和鋸齒狀。一旦人們開始使用圖形加速,這些東西都將變得平滑。

雙線性插值大多使用在放大。它也能使用在縮小,但是超過某個度,我們將會遇到同樣的問題,我們在嘗試將太多的紋素放到相同的畫素上。opengl僅使用最多4個紋素渲染乙個畫素,因此許多資訊仍然會丟失。

如果我們看應用了雙線性插值的紋理,當我們在遠處看它移動時看起來會很嘈雜,因為每幀都會選擇不同的紋素。

我們如何才能在縮小紋理時不引用嘈雜並使用上所有紋素呢?我們可以生成一組優化後的不同尺寸的紋理,然後在我們執行的時候使用它們。由於這些紋理已預先生成,它們能使用更多高昂的技術去過濾所有紋素,並且在執行時opengl會根據紋理在螢幕上的最終大小選擇最合適的層。

生成的可以具有更多細節,更少噪點,並且整體上看起來更好。儘管需要更多的記憶體,但渲染速度也會更快,因為較小的層級能更容易儲存在gpu的紋理快取中。讓我們來仔細研究一下原尺寸的1/8倍的,在使用了雙線性過濾使用紋理對映和雙線性過濾沒有使用對映。為了清楚已被擴大:

雙線性過濾沒有mipmap

雙線性過濾+mipmap

使用mipmap的版本擁有更多細節,由於影象預處理到單獨的層級,所有紋素最終都會在最終的影象中使用。

當使用雙線性過濾的mipmap時,有時在渲染場景中可以看到明顯的跳躍或線,由於opengl在紋理的不同mipmap層級之間切換。比較不同的opengl紋理的過濾模式將在下面進一步指出。

三線性插值通過在不同mipmap層級之間插值來解決這個問題,這樣總共8個紋素將用於插值得到最終的畫素值,使得影象更平滑。

opengl有兩個可被設定的引數:

這些相對應於上面的縮小和放大描述。

gl_texture_mag_filter接受以下選項:

gl_nearest對應最鄰近渲染;

gl_linear對應雙線性過濾;

gl_linear_mipmap_nearest對應雙線性過濾+mipmap;

gl_linear_mipmap_linear對應三線性過濾;

本課中將進一步介紹圖形示例和最常見選項的進一步說明。

我們首先需要繫結紋理,然後我們在這個紋理上設定合適的過濾引數:

gles20.glbindtexture(gles20.gl_texture_2d, mtexturehandle);

gles20.gltexparameteri(gles20.gl_texture_2d, gles20.gl_texture_min_filter, filter);

複製**

這真的很容易!在載入紋理到opengl中後,紋理仍然是繫結的,我們可以簡單的呼叫:

gles20.glgeneratemipmap(gles20.gl_texture_2d);

複製**

它將為我們生成所有的mipmap層級,並且這些層級會根據紋理過濾自動使用。

這個模式讓人想起舊版3d遊戲軟體的渲染。

gl_texture_min_filter = gl_nearest

gl_texture_mag_filter = gl_nearest

複製**

許多支援3d加速的首批遊戲都使用此模式,這是今天在android手機上平滑紋理的有效方式。

gl_texture_min_filter = gl_linear_mipmap_nearest

gl_texture_mag_filter = gl_linear

複製**

靜態圖上很難看圖問題,但是當物體運動時,您可能會注意到渲染的畫素在mipmap層級之間切換的水平條帶。

此模式通過在mipmap層級之間進行插值,改進了使用mipmap的雙線性過濾的渲染質量。

gl_texture_min_filter = gl_linear_mipmap_linear

gl_texture_mag_filter = gl_linear

複製**

畫素在近距離和遠距離之間完全平滑;事實上,紋理現在可能在傾斜角度下顯示的過於平滑。 各向異性過濾(anisotropic filtering)是一種更先進的技術,受到某些移動gpu的支援,可用於改善最終結果,超出三線性過濾所能提供的效果。

使用其他模式可以達到什麼樣的效果?例如,您何時會使用像gl_nearest_mipmap_linear這樣的東西?

python課程 Python課程

全新python課程 更多關於酷哥少兒程式設計平台 酷哥少兒程式設計 介面 酷哥少兒程式設計體系 酷哥少兒程式設計平台 1 大顆粒程式設計 樂高積木拼搭更有趣了,區別於普通的樂高積木搭建課,酷哥的大顆粒課程加入了,易於讓學齡前兒童接受的刷卡程式設計方式,課程中輕鬆融入程式設計元素。酷哥刷卡程式設計作...

Ruby on Rails全棧課程 課程目錄

前言 我還是程式設計小白的時候,開始接觸ruby,當時學習資料只有ruby實戰聖經,雖然講的已經很詳細了,但是對於小白狀態的我,很多地方還是很模糊,很多地方需要自己摸索,走了不少彎路。所以我下決心寫乙個實戰課程,來幫助和我一樣起跑線的同學攻克ruby語言。該課程完全按照我是小白時候的想要的課程寫的,...

課程筆記 優秀課程筆記整理

目錄 cs231n 李巨集毅老師機器學習課程 pytorch學習筆記 深度學習概述 神經網路基礎之邏輯回歸 神經網路基礎之python與向量化 淺層神經網路 深層神經網路 深度學習的實用層面 優化演算法 超引數除錯 batch正則化和程式設計框架 機器學習策略 上 機器學習策略 下 卷積神經網路基礎...