在進行模型渲染的時候為了使模型看起來更加的逼真,細節更加的真實我們使用紋理貼在物體的表面。使用紋理我們可以不用再為每個頂點指定顏色,通過紋理對映到頂點上然後對紋理進行操作,和配色。然模型顯得更加的漂亮、真實。
為了能夠使紋理能夠正確的對映到模型的每乙個頂點上,在我們定義模型座標時,額外還要指定每個頂點各自對應紋理座標,紋理座標用於指定當前頂點對應的是紋理的那個部分。
一張紋理是乙個畫素矩陣,我們通過讀取中的畫素資料儲存到這個畫素矩陣中就形成了一張紋理,每個畫素中儲存了當前畫素的深度、以及顏色值等,在opengl中2d紋理座標的原點定義在紋理的左下角,x軸和y軸的取值範圍為 0 - 1 ,通過0 -1之間的值來表示每個紋理畫素。
通常我們使用uv來表示2d紋理的座標,即u代表紋理的x座標,v代表紋理的y軸方向的座標.
紋理座標的範圍通常是從(0, 0)到(1, 1),當我們把頂點對應的紋理座標設定來超出了這個範圍時,opengl為我們提供了幾種超出範圍時的解決方式:
設定紋理的環繞方式函式:
紋理座標不依賴於解析度(resolution),它可以是任意浮點值,所以opengl需要知道怎樣將每個紋理畫素對映到模型的紋理座標。當你有乙個很大的物體但是紋理的解析度很低的時候每個紋理上的畫素不一定正好對應頂點紋理座標,此時我們就需要使用紋理過濾的方式來指定這個紋理座標點對應的畫素顏色。
gl_nearest(也叫鄰近過濾,nearest neighbor filtering)是opengl預設的紋理過濾方式。這種方式的原理是選擇畫素的中心點最接近紋理座標的畫素作為當前紋理座標的畫素。
gl_linear(也叫線性過濾,(bi)linear filtering)它會基於紋理座標附近的紋理畫素,這種方式的原理是取在紋理座標點附近的幾個畫素顏色值進行混合得到最終對應紋理座標點的顏色,當畫素的中心點離紋理座標越近則當前畫素顏色值所佔的百分比就越高。
設定紋理的過濾:
在乙個遊戲場景中會有很多的模型,每個模型的遠近不同,並且每個模型上都有乙個紋理貼圖,在遠處的物體我們無法看清楚,如果在遠處的物體都是用高解析度紋理這樣不僅非常的消耗資源,而且在獲取紋理顏色的時候,遠處的紋理只需要獲取少數的顏色,而在乙個高解析度的紋理中獲取幾個顏色是非常困難的。
在opengl中為了解決這個問題,給我們提供了乙個多級漸遠的紋理的處理方式,
它簡單來說就是一系列的紋理影象,後乙個紋理影象是前乙個的二分之一。多級漸遠紋理背後的理念很簡單:距觀察者的距離超過一定的閾值,opengl會使用不同的多級漸遠紋理,即最適合物體的距離的那個。由於距離遠,解析度不高也不會被使用者注意到。同時,多級漸遠紋理另一加分之處是它的效能非常好。
在渲染中切換多級漸遠紋理級別(level)時,opengl在兩個不同級別的多級漸遠紋理層之間會產生不真實的生硬邊界。就像普通的紋理過濾一樣,切換多級漸遠紋理級別時你也可以在兩個不同多級漸遠紋理級別之間使用nearest和linear過濾。為了指定不同多級漸遠紋理級別之間的過濾方式
為了能夠使用opengl來渲染紋理,我們需要使用先讀取紋理中的所有畫素資訊,並將這些畫素資訊傳遞給opengl進行處理,最終渲染出影象。
soil是簡易opengl影象庫,它能夠讀取當前主流的格式。
讀取資料的流程:
//用於獲取紋理的寬度和高度
int width, height;
//獲取紋理資料位址
/*引數 :紋理名稱、儲存紋理寬度的變數、儲存紋理高度的變數、紋理的通道、讀取紋理中的那些資訊,rgb表示只讀取rgb顏色值
//在使用完資料之後需要釋放資料
soil_free_image_data(image);
通過這個函式我們就可以獲取到紋理的資訊了。
為了使opengl能夠使用紋理中的資料進行渲染,我們需要在視訊記憶體中分配一片記憶體來儲存這些資料,首先我們也需要建立乙個紋理物件來管理這片記憶體,建立紋理物件和建立緩衝物件的格式類似。
gluint texture;
glgentextures(1, &texture);
glbindtexture(gl_texture_2d, texture);
在建立好物件之後就需要分配記憶體來儲存這些資料:
/*
*/glteximage2d(gl_texture_2d, 0, gl_rgb, width, height, 0, gl_rgb, gl_unsigned_byte, image);
//如果要使用多級漸遠紋理,我們必須手動設定所有不同的影象(不斷遞增上面函式的第二個引數)。或者,直接在生成紋理之後呼叫glgeneratemipmap。這會為當前繫結的紋理自動生成所有需要的多級漸遠紋理。
glgeneratemipmap(gl_texture_2d);
當我們為頂點設定紋理座標之後頂點就具有位置、顏色、紋理三個屬性了,此時每個頂點資料結構在記憶體中儲存的方式為:
opengl紋理單元
可以這樣簡單的理解為 顯示卡中有n個紋理單元 具體數目依賴你的顯示卡能力 每個紋理單元 gl texture0 gl texture1等 都有gl texture 1d gl texture 2d等,如下 cpp view plain copy print struct textureunit te...
openGL 紋理使用
最近找了點資料學習了下opengl 紋理的使用 先有個 整體把握,然後再去看大部頭中的細節講解,感覺這樣的學習方式好些 總結下紋理使用總體流程 1 啟用紋理 glenable gl texture 2d 2 載入紋理 3 紋理 的顯示 載入紋理 1 讀取紋理影象高寬和畫素資料到記憶體中,老版本 op...
OPENGL紋理基礎
對於vbo道理是一樣的 1.紋理座標 在繪製一條線段時,我們設定其中乙個端點為紅色,另乙個端點為綠色,則opengl會自動計算線段中其它各畫素的顏色,如果是使用glshademode gl smooth 則最終會形成一種漸變的效果 例如線段中點,就是紅色和綠色的中間色 類似的,在繪製一條線段時,我們...