Android OpenGL ES(七)----理解紋理與紋理過濾

1.理解紋理

?

OpenGL中的紋理能夠用來表示圖像。照片,甚至由一個數學算法生成的分形數據。每一個二維的紋理都由很多小的紋理元素組成。它們是小塊的數據,類似于我們前面討論過的片段和像素。要使用紋理,最經常使用的方式是直接從一個圖像文件載入數據。

?

每一個二維紋理都有其自己的坐標空間,其范圍是從一個拐角的(00)到還有一個拐角的(11)。依照慣例,一個維度叫做S,而還有一個稱為T。當我們想要把一個紋理應用于一個三角形或一組三角形的時候。我們要為每一個頂點指定一組ST紋理坐標,以便OpenGL知道須要用那個紋理的哪個部分畫到每一個三角形上。

這些紋理坐標有時也會被稱為UV紋理坐標。如圖:



圖1 ?OpenGL二維紋理坐標

?

對一個OpenGL紋理來說,它沒有內在的方向性,因此我們能夠使用不同的坐標把它定向到不論什么我們喜歡的方向上。

然而,大多數計算機圖像都有一個默認的方向。它們通常被規定為Y軸向下,Y的值隨著向圖像的底部移動而添加。僅僅要我們記住,假設想用正確的方向觀察圖像,那紋理坐標就必需要考慮這點。這就不會給我們帶來不論什么麻煩。

?

在標準OpenGL?ES?2.0中。紋理不必是正方形,可是每一個維度都應該是2的冪(POT)。

這就意味著每一個維度都是這種一個數字,如128256512等。這樣規定的原因在于非POT紋理能夠被使用的場合很有限,而POT紋理使用于各種情況。

?

紋理的尺寸也有一個最大值,它依據不同的實現而變化。可是通常都比較大,比方2048*2048

?


2.理解紋理過濾

?


當紋理的大小被擴大或者縮小時,我們還須要使用紋理過濾明白說明會發生什么。當我們在渲染表面上繪制一個紋理時,那個紋理的紋理元素可能無法精確地映射到OpenGL生成的片段上。

有兩種情況:縮小和放大。

當我們盡力把幾個紋理元素擠進一個片段時,縮小就發生了;當我們把一個紋理元素擴展到很多片段時。方法就發生了。針對每一種情況,我們能夠配置OpenGL使用一個紋理過濾器。

?

首先。講述兩個主要的過濾模式:近期鄰過濾和雙線性插值。還有其它的過濾模式,以后的博文會解說。我們會使用以下的圖像闡述每一種過濾模式。




?

近期鄰過濾

?

這個方式為每一個片段選擇近期的紋理元素。當我們放大紋理時,它的鋸齒效果看起來相當明顯,例如以下圖所看到的。




?

每一個紋理單元都清楚的顯示為一個小方塊。

?

當我們縮小紋理時。由于沒有足夠的片段用來繪制全部的紋理單元,很多細節將會丟失。




?

雙線性過濾


?

雙線性過濾使用雙線性插值平滑像素之間的過渡。而不是為每一個片段使用近期的紋理元素。OpenGL會使用四個鄰接的紋理元素。并在它們之間用一個線性插值算法做插值,這個算法與前面所講的平滑坐在著色一樣。我們之所以稱它為雙線性插值。是由于它是沿著兩個維度插值的。以下是使用雙線性差值放大后的圖像。它採用的紋理與前面的同樣。






這個紋理如今看起來比曾經平滑多了。

但還是有些鋸齒顯現出來,由于我們把這個紋理擴展得太多。可是鋸齒不像使用近期鄰過濾那么明顯。

?


MIP貼圖



雖然雙線性過濾非常適合處理放大,可是對于縮小到超過一定的大小時,它就不好用了。一個紋理在渲染表面所占大小降低得越多。就會有越多的紋理元素擁擠到每個片段上。

由于OpenGL的雙線性過濾僅僅給每個片段使用四個紋理元素。我們將會丟失非常多細節。

由于每一幀都要選擇不同的紋理元素。這還會引起噪音以及移動中的物體閃爍。

?

為了克服這些缺陷。能夠使用MIP貼圖技術,它能夠用來生成一組優化過的不同大小的紋理。當生成這組紋理的時候,OpenGL會使用全部的紋理元素生成每一個級別的紋理,當過濾紋理時,還要確保全部的紋理元素都能被使用。在渲染時,OpenGL會依據每一個片段的紋理元素數量為每一個片段選擇最合適的級別。

?

下圖是一組MIP貼圖的紋理,把它們合并在一當個圖上是為了方便對照。



? 圖2 MIP貼圖的紋理



使用MIP貼圖。會占用很多其它的內存,可是渲染也會更快,這是由于較小級別的紋理在GPU的紋理緩存中占用較少的空間。

?

為了更好地理解MIP貼圖是怎樣提高縮小情況下的質量,我們比較一下那個可愛的機器人。使用雙線性過濾把紋理元素尺寸縮小到其原來的12.5%。例如以下圖:



? 圖3 使用雙線性過濾縮小



就這樣的質量,可能還不如近期鄰過濾。看一下當我們增加MIP貼圖時會得到什么。例如以下圖:



? 圖4 使用MIP貼圖縮小



隨著MIP貼圖的使用。OpenGL將選擇最合適的紋理級別。然后用優化過的紋理做雙線性插值。每一個級別的紋理都是用來自全部紋理元素的信息構建的。因此得到的圖形看起來更好些。保留了很多其它的細節。

?

三線性過濾

?

假設OpenGL在不同的MIP貼圖級別之間來回切換,當我們用雙線性插值來使用MIP貼圖時。在其渲染的場景中,在不同級別的MIP貼圖切換時。我們有時候能看到明顯的跳躍或者線條。我們能夠切換到三線性插值。這樣。每一個片段總共要使用8個紋理元素插值。

這有助于消除每一個MIP貼圖級別之間的過渡,而且得到一個更平滑的圖像。

?


3.程序中紋理參數表



方法GLES20.glTextParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAX_FILTER。“紋理過濾模式”)。第二個參數指放大的情況。

方法GLES20.glTextParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,“紋理過濾模式”);第二個參數指縮小的情況。

第一個參數是告訴OpenGL這應該被作為一個二維紋理對待。


表1 ?OpenGL紋理過濾模式

GL_NEAREST

近期鄰過濾

? ? ? ? ? ? ? ? ? ? ? ? GL_NEAREST_MIPMAP_NEAREST

? ? ? ? ? ? ? ? ? ? 使用MIP貼圖的近期鄰過濾

? ? ? ? GL_NEAREST_MIPMAP_LINEAR

? ? ? 使用MIP貼圖級別之間插值的近期鄰過濾

? ? ? ? ? ? ? ? ? ? ? GL_LINEAR

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 雙線性插值

?GL_LINEAR_MIPMAP_NEAREST

使用MIP貼圖的雙線性插值

?GL_LINEAR_MIPMAP_LINEAR

三線性插值(使用MIP貼圖級別之間插值的雙線性過濾)



表2 ?每種情況同意的紋理過濾模式

縮小GL_NEAREST
GL_NEAREST_MIPMAP_NEAREST
GL_NEAREST_MIPMAP_LINEAR
GL_LINEAR
GL_LINEAR_MIPMAP_NEAREST
GL_LINEAR_MIPMAP_LINEAR
放大GL_NEAREST
GL_LINEAR

下一篇紋理的應用效果圖例如以下:




本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/281856.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/281856.shtml
英文地址,請注明出處:http://en.pswp.cn/news/281856.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

WPF 基礎控件之托盤

WPF 基礎控件之托盤控件名:NotifyIcon作者: WPFDevelopersOrg - 吳鋒|驚鏵原文鏈接: https://github.com/WPFDevelopersOrg/WPFDevelopers框架使用大于等于.NET40。Visual Studio 2022。項目使用 MIT 開源許可協議。新建NotifyIcon自定義…

java 匿名 異常_JAVA類(內部類、匿名內部類、異常、自定義異常)

內部類package AA;public class類 {int de123;StringBuffer deenewStringBuffer();public class成員內部類{public voidff() {System.out.println("這是成員內部類方法");}}/*1.可以訪問外部類所有的成員,包括被聲明為私有(private)的;2.可以使…

ASP.NET 多環境下配置文件web.config的靈活配置---轉

注意:本功能在.Net Core中已經不可用,暫時需手動修改web.config中的信息,或者將其設置在appsettings.XXX.json中,然后再使用web.config中的環境變量來制定使用的具體appsettings文件。 轉自:https://www.cnblogs.com/h…

英語之各類人群

工作狂:workaholic 月光族:moonlight group 電燈泡:third wheel 菜鳥:newbie 夜貓子:night owl 路癡:somebody has no sense of derection 宅男宅女:homebody 時尚的潮人:trend sett…

Wget CVE-2014-4877:FTP 符號鏈接任意文件系統訪問

Wget 爆出 CVE-2014-4877 漏洞:FTP 符號鏈接任意文件系統訪問。 Package: wgetVersion: 1.15-1Severity: important Upstream fix: http://git.savannah.gnu.org/cgit/wget.git/commit/?id18b0979357ed7dc4e11d4f2b1d7e0f5932d82aa7 References&#xf…

JavaScript 學習提升

javascript 技能提升 理解閉包 閉包,官方對閉包的解釋是:一個擁有許多變量和綁定了這些變量的環境的表達式(通常是一個函數),因而這些變量也是該表達式的一部分。閉包的特點:1. 作為一個函數變量的一個引用…

Uranium UI Kit

Uranium UI Kit控件名:Uranium UI Ki作者:enisn原文鏈接: https://github.com/enisn/UraniumUI項目使用 Apache-2.0 開源許可協議。Uranium 是用于 .NET MAUI 的免費和開源 UI 工具包。它提供了一組控件和實用程序來構建現代應用程序。它建…

數據庫監控框架 oneproxy-monitor 開源了

OneProxy-Monitor 是數據庫監控的框架,通過這個框架可以快速的開發出一款數據庫的監控軟件。目前已經在這個框架下面開發出來了sql server的監控軟件oneproxy-for-sqlserver, postgresql的監控軟件oneproxy-for-postgresql。并且還可以作為協議成的調試軟…

java nio epoll_Java NIO 選擇器(Selector)的內部實現(poll epoll)

http://blog.csdn.net/hsuxu/article/details/9876983之前強調這么多關于linux內核的poll及epoll,無非是想讓大家先有個認識:Java NIO中的選擇器依賴操作系統內核的這些系統調用,我們這里只講解與linux內核相關的NIO實現,當然&…

Next.js 7發布,構建速度提升40%

Next.js團隊發布了其開源React框架的7版本。該版本的Next.js主要是改善整體的開發體驗,包括啟動速度提升57%、開發時的構建速度提升40%、改進錯誤報告和WebAssembly支持。\\Next.js是一個React框架,它的主要目標是在生產環境中提供出色的性能和良好的開發…

《Java多線程編程核心技術》讀后感(十五)

線程的狀態 線程對象在不同的運行時期有不同的狀態,狀態信息就存在與State枚舉類中。 驗證New,Runnable,Terminated new:線程實例化后還從未執行start()方法時的狀態 runnable:線程進入運行的狀態 terminated:線程被銷毀時的狀態 …

隊列(queue)

隊列(queue)和棧一樣支持push和pop兩個操作。但與棧不同的是,pop兩個操作。但與棧的不同的是,pop完成的不是取出最頂端的元素,而是最底端的元素。也就是說最初放入的元素能夠最先被取出(這種行為被叫做FIFO:First In First Out,即…

一題多解,ASP.NET Core應用啟動初始化的N種方案[上篇]

ASP.NET Core應用本質上就是一個由中間件構成的管道,承載系統將應用承載于一個托管進程中運行起來,其核心任務就是將這個管道構建起來。在ASP.NET Core的發展歷史上先后出現了三種應用承載的編程方式,而且后一種編程模式都提供了針對之前編程…

java程序猿面試問缺點怎么回答_JAVA程序員面試32問,你能回答多少題

第一,談談final, finally, finalize的區別。第二,Anonymous Inner Class (匿名內部類) 是否可以extends(繼承)其它類,是否可以implements(實現)interface(接口)?第三,Static Nested Class 和 In…

ExecutorService——shutdown方法和awaitTermination方法

ExecutorService的關閉shutdown和awaitTermination為接口ExecutorService定義的兩個方法,一般情況配合使用來關閉線程池。 方法簡介shutdown方法:平滑的關閉ExecutorService,當此方法被調用時,ExecutorService停止接收新的任務并且…

WPF 簡單模仿 VSCode 界面布局

WPF 簡單模仿 VSCode 界面布局本文經原作者授權以原創方式二次分享,歡迎轉載、分享。WPF 簡單模仿 VSCode 界面布局作者:弈虎-呂女士會翻墻原文鏈接: https://github.com/Chen-Lin-Zhao-Wei/WPFLikeVSCode分享一篇群友這幾天自己寫的 WPF 簡…

compare()方法+使用compare方法

compare()方法 compare(lob1,lob2,amount,offset_1,offset_2) 1用于比較2個lob存儲的數據,比較的方式是從指定偏移量開始,對指定數量的字符或者字節進行比較。 2如果比較內容相同,返回0,否則返回-1或1. 3如果參數設置有誤或不合…

linux 下 mysql默認表_linux環境下mysql默認是區分表名大小寫的

在linux環境下,mysql默認表明是區分大小寫的,我們可以查看全局變量發現:mysql> show variables like lower%;-------------------------------| Variable_name | Value |-------------------------------| lower_case_file_system | OFF || lower_cas…

dot-- 資源匯總

http://graphviz.org/doc/info/attrs.htmlhttp://graphs.grevian.org/http://graphs.grevian.org/examplehttp://www.linuxdevcenter.com/pub/a/linux/2004/05/06/graphviz_dot.html轉載于:https://www.cnblogs.com/itzxy/p/7860276.html

兩將軍問題和TCP三次握手

兩將軍問題,又被稱為兩將軍悖論、兩軍問題, 是一個經典的計算機思想實驗。首先, 為避免混淆,我們需要認識到兩將軍問題雖然與拜占庭將軍問題相關,但兩者不是一個東西。拜占庭將軍問題是一個更通用的兩將軍問題版本&…