紋理

1.OpenGLES提供了一個為幾何圖形中的每個頂點設置不同顏色的方法罢坝。

2.紋理可以控制一個渲染的三角形中的每個像素的顏色。

3.紋理是一個用來保存圖像的顏色元素值的OpenGLES緩存伴鳖。

4.當用圖像初始化一個紋理緩存之后,在這個圖像中的像素變成了紋理中的一個紋素徙硅。與像素類似榜聂,紋素保存顏色數(shù)據(jù)。

5.紋理坐標系為S嗓蘑、T峻汉、R軸。3D紋理就是一個層餅脐往,一個在擁有R休吠、S和T軸沿著R軸堆疊的多個2D紋理的層餅。

6.幀緩存的像素坐標位置叫做視口(viewport)坐標业簿。

7.一個場景中的每個幾何坐標的轉換都要耗費一打的矢量數(shù)學運算瘤礁,但是GPU經(jīng)常會在每秒執(zhí)行10億次的矢量運算。與內(nèi)存讀取相比梅尤,這個速度是如此之快柜思,以至于這個轉換在實際的應用中幾乎不會產(chǎn)生性能影響岩调。

8.在每個頂點的X、Y赡盘、Z坐標被轉換為視口坐標后号枕,GPU會設置轉換成三角形內(nèi)的每個像素顏色。轉換幾何形狀數(shù)據(jù)數(shù)據(jù)為幀緩存中的顏色像素的渲染步驟叫做點陣化(rasterzing)陨享,每個顏色像素叫做片元(fragment)葱淳。當OpenGLES沒有使用紋理時,GPU會根據(jù)包含該片元的對象的頂點的顏色來計算每個片元的顏色抛姑。當設置了使用紋理后赞厕,GPU會根據(jù)在當前綁定的紋理緩存中的紋素來計算每個片元的顏色。

9.程序需要制定怎么對齊紋理和頂點定硝,以便讓GPU知道每個片元的顏色由哪些紋素確定皿桑。這個對齊的過程叫做映射(mapping)。

10.U----->S,V------>T蔬啡。

11.渲染過程中的取樣可能會導致紋理被拉伸诲侮、壓縮、甚至翻轉箱蟆。

12.

glTexParameterf(self.target, parameterID, value);

void glTexParameterf (GLenum target,GLenum pname,GLfloat param);函數(shù)來配置每個綁定的紋理浆西,以便讓OpenGLES知道怎么處理可用紋素的數(shù)量與需要被著色的片元的數(shù)量不匹配問題。


GL_TEXTURE_MAG_FILTER 表示紋素不夠

GL_TEXTURE_MIN_FILTER表示片元不夠

GL_LINEAR展示線性插值

GL_NEAREST展示最鄰近差值取樣模式

13.MIP貼圖是一個為紋理存儲多個細節(jié)級別的技術顽腾〗悖可以減少GPU取樣的數(shù)量來提高渲染的性能,但是使用MIP貼圖會使每個紋理需要的內(nèi)存增加1/3抄肖。

14.

SceneVertex定義了頂點坐標和紋理坐標久信。

vertices數(shù)組初始化了紋理坐標和位置坐標。

15.

GLKTextureInfo*textureInfo = [GLKTextureLoader textureWithCGImage:imageRef options:nil error:NULL];

這個方法接收一個CGImageRef使得圖像的數(shù)據(jù)源可以是任何Core Graphics支持的形式漓摩。

GLKTextureLoader會自動調(diào)用glTexParameteri()方法來為創(chuàng)建的紋理緩存設置OpenGLES取樣和循環(huán)模式裙士。

16.手動實現(xiàn)一個GLKTextureLoader

AGLKTextureLoader

AGLKTextureInfo是一個封裝了紋理緩存的有用信息的簡單類害淤,例如相應的OpenGLES紋理緩存的標識符以及紋理的圖像尺寸测秸。

AGLKTextureLoader的實現(xiàn)展現(xiàn)了Core Graphics 和 OpenGLES的整合,提供了與GLKit中GLKTextureLoader相似的功能沛豌。

glGenTextures()和glBindTextures()函數(shù)與用于頂點緩存的命名方式相似的函數(shù)的工作方式相同夭咬。

void glTexImage2D (GLenum target,GLint level,GLint internalformat,GLsizei width,GLsizei height,GLint border,GLenum format,GLenum type,const GLvoid* pixels);

函數(shù)復制圖片像素的顏色數(shù)據(jù)到綁定的紋理緩存中啃炸。

第一個參數(shù)是用于2D紋理的GL_TEXTURE_2D.

第二個參數(shù)用于指定MIP貼圖的初始細節(jié)級別。如果不用MIP卓舵,則是0.

第三個參數(shù)internalFormat,用于指定在紋理緩存內(nèi)每個紋素需要保存的信息的數(shù)量南用。iOS設備分GL_RGB,GL_RGBA兩種。

第四個和第五個參數(shù)用來指定圖像的寬度和高度。高度和寬度需要是2的冪裹虫。

第六個參數(shù)border一直用來確定圍繞紋理的紋素的一個邊界大小肿嘲,但是在OpenGLES中總是被設置為0。

第七個參數(shù)format用于指定初始化緩存所使用圖像數(shù)據(jù)中的每個像素需要保存的信息筑公。這個參數(shù)總是和internalFormat相同雳窟。

第八個參數(shù)用于指定緩存中的紋素數(shù)據(jù)所使用的位編碼類型。GL_UNSIGNED_BYTE可提供最佳最佳色彩質(zhì)量匣屡,但是它的每個紋素中每個顏色元素的保存需要一字節(jié)的存儲空間封救。不管為為每個顏色元素保存的位數(shù)量是多少,顏色元素的強度最終都會被GPU縮放到0.0到1.0的強度之間耸采。

第九個參數(shù)是一個要被復制到綁定的紋理緩存中的圖片的像素顏色數(shù)據(jù)的指針兴泥。



CG函數(shù)把指定的cgImage拖入imageData指定的字節(jié)中工育。CG是把cgImage拖入一個適當大小的CG上下文中虾宇,這個過程的一個副作用是把圖像的尺寸調(diào)整為2的冪。圖像在繪制的過程中被反轉了如绸。反轉Y 軸是必須的嘱朽。

函數(shù)最后返回imageData和數(shù)據(jù)對應的寬度和高度。

17.

glEnable(GL_BLEND);

void glEnable (GLenum cap);

函數(shù)開啟混合怔接。

glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA);

void glBlendFunc (GLenum sfactor,GLenum dfactor);

函數(shù)來設置混合函數(shù)搪泳。sfactor參數(shù)用于指定每個片元的最終顏色元素是怎樣混合的。dfactor參數(shù)用于指定在目標幀緩存中已經(jīng)存在顏色元素怎樣影響混合扼脐。

源因子和目標因子是可以通過glBlendFunc函數(shù)來進行設置的岸军。glBlendFunc有兩個參數(shù),前者表示源因子瓦侮,后者表示目標因子艰赞。這兩個參數(shù)可以是多種值,下面介紹比較常用的幾種肚吏。

GL_ZERO:?????表示使用0.0作為因子方妖,實際上相當于不使用這種顏色參與混合運算。

GL_ONE:??????表示使用1.0作為因子罚攀,實際上相當于完全的使用了這種顏色參與混合運算党觅。

GL_SRC_ALPHA:表示使用源顏色的alpha值來作為因子。

GL_DST_ALPHA:表示使用目標顏色的alpha值來作為因子斋泄。

GL_ONE_MINUS_SRC_ALPHA:表示用1.0減去源顏色的alpha值來作為因子杯瞻。

GL_ONE_MINUS_DST_ALPHA:表示用1.0減去目標顏色的alpha值來作為因子。

除 此以外炫掐,還有GL_SRC_COLOR(把源顏色的四個分量分別作為因子的四個分量)又兵、GL_ONE_MINUS_SRC_COLOR、 GL_DST_COLOR、GL_ONE_MINUS_DST_COLOR等沛厨,前兩個在OpenGL舊版本中只能用于設置目標因子宙地,后兩個在OpenGL 舊版本中只能用于設置源因子。新版本的OpenGL則沒有這個限制逆皮,并且支持新的GL_CONST_COLOR(設定一種常數(shù)顏色宅粥,將其四個分量分別作為 因子的四個分量)、GL_ONE_MINUS_CONST_COLOR电谣、GL_CONST_ALPHA秽梅、 GL_ONE_MINUS_CONST_ALPHA。另外還有GL_SRC_ALPHA_SATURATE剿牺。新版本的OpenGL還允許顏色的alpha 值和RGB值采用不同的混合因子企垦。但這些都不是我們現(xiàn)在所需要了解的。畢竟這還是入門教材晒来,不需要整得太復雜~

舉例來說:

如果設置了glBlendFunc(GL_ONE,?GL_ZERO);钞诡,則表示完全使用源顏色,完全不使用目標顏色湃崩,因此畫面效果和不使用混合的時候一致(當然效率可能會低一點點)荧降。如果沒有設置源因子和目標因子,則默認情況就是這樣的設置攒读。

如果設置了glBlendFunc(GL_ZERO,?GL_ONE);朵诫,則表示完全不使用源顏色,因此無論你想畫什么薄扁,最后都不會被畫上去了剪返。(但這并不是說這樣設置就沒有用,有些時候可能有特殊用途)

如 果設置了glBlendFunc(GL_SRC_ALPHA,?GL_ONE_MINUS_SRC_ALPHA);邓梅,則表示源顏色乘以自身的alpha 值脱盲,目標顏色乘以1.0減去源顏色的alpha值,這樣一來震放,源顏色的alpha值越大宾毒,則產(chǎn)生的新顏色中源顏色所占比例就越大,而目標顏色所占比例則減 小殿遂。這種情況下诈铛,我們可以簡單的將源顏色的alpha值理解為“不透明度”。這也是混合時最常用的方式墨礁。

如果設置了glBlendFunc(GL_ONE,?GL_ONE);幢竹,則表示完全使用源顏色和目標顏色,最終的顏色實際上就是兩種顏色的簡單相加恩静。例如紅色(1,?0,?0)和綠色(0,?1,?0)相加得到(1,?1,?0)焕毫,結果為黃色蹲坷。

注意:

所 謂源顏色和目標顏色,是跟繪制的順序有關的邑飒。假如先繪制了一個紅色的物體循签,再在其上繪制綠色的物體。則綠色是源顏色疙咸,紅色是目標顏色县匠。如果順序反過來,則 紅色就是源顏色撒轮,綠色才是目標顏色乞旦。在繪制時,應該注意順序题山,使得繪制的源顏色與設置的源因子對應兰粉,目標顏色與設置的目標因子對應。不要被混亂的順序搞暈了顶瞳。

紋理混合這塊揭示了iOS Core Animation技術的基本原理玖姑。每個Core Animation層使用一個對應的openGLES的像素顏色渲染緩存來保存像素顏色數(shù)據(jù)。每個層的像素顏色數(shù)據(jù)作為一個openGLES紋理緩存浊仆,并且紋理緩存會使用glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA)函數(shù)來與后幀緩存混合在一起客峭。

18.多重紋理方法:

第一張圖片是3_4例子豫领,是多通道渲染抡柿。很多有用的可視效果可以通過片元顏色與像素顏色渲染緩存中現(xiàn)存的顏色相混合來實現(xiàn),但是這個技術有兩個主要的缺點:每次顯示更新時幾何圖形必須要被渲染一到多次等恐,混合函數(shù)需要從像素顏色渲染緩存讀取顏色數(shù)據(jù)以便于片元顏色混合洲劣。然后結果被寫回幀緩存。當帶有透明度數(shù)據(jù)的多個紋理層疊時课蔬,每個紋理的像素顏色渲染緩存的顏色會被再次讀取囱稽、混合、重寫二跋。

內(nèi)存訪問限制了性能战惊,因此多通道渲染是次優(yōu)的。

多重紋理方法:所有現(xiàn)代的GPU都能夠同時從至少兩個兩個紋理緩存中取樣紋素扎即。GLKit的GLKBaseEffect類同時支持兩種紋理吞获。執(zhí)行紋素取樣和混合的硬件組件叫做一個紋理單元或者取樣器。

GLintiUnits;

glGetIntegerv(GL_MAX_TEXTURE_UNITS, &iUnits);

如果應用中需要超過兩個以上的紋理單元谚鄙,在確定一個單獨的通道中可以結合多個紋理之前各拷,需要使用以上的代碼。

多重紋理另外一個配置選項闷营,來自3_5例子:

GLKEffectPropertyTexture的envMode屬性用于配置混合模式烤黍。

GLKTextureEnvModeModulate模式會讓所有的為燈光和其他效果計算出來的顏色與從一個紋理取樣的顏色相混合知市。

與3_4加載相同的兩個紋理,但是不再明確地啟動與幀緩存的像素顏色渲染緩存的混合速蕊。

第二個self.baseEffect.texture2d1.envMode=GLKTextureEnvModeDecal;模式會使用一個于glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA);類似的方程式來混合第二個和第一個紋理嫂丙。

19.自定義紋理:

3_6例子,一個用GLKBaseEffect生成的glsl語言實現(xiàn)繪制正方體规哲。

另一個用自定義的shading language.






最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末奢入,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子媳叨,更是在濱河造成了極大的恐慌腥光,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,042評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件糊秆,死亡現(xiàn)場離奇詭異武福,居然都是意外死亡,警方通過查閱死者的電腦和手機痘番,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,996評論 2 384
  • 文/潘曉璐 我一進店門捉片,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人汞舱,你說我怎么就攤上這事伍纫。” “怎么了昂芜?”我有些...
    開封第一講書人閱讀 156,674評論 0 345
  • 文/不壞的土叔 我叫張陵莹规,是天一觀的道長。 經(jīng)常有香客問我泌神,道長良漱,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,340評論 1 283
  • 正文 為了忘掉前任欢际,我火速辦了婚禮母市,結果婚禮上,老公的妹妹穿的比我還像新娘损趋。我一直安慰自己患久,他們只是感情好,可當我...
    茶點故事閱讀 65,404評論 5 384
  • 文/花漫 我一把揭開白布浑槽。 她就那樣靜靜地躺著蒋失,像睡著了一般。 火紅的嫁衣襯著肌膚如雪括荡。 梳的紋絲不亂的頭發(fā)上高镐,一...
    開封第一講書人閱讀 49,749評論 1 289
  • 那天,我揣著相機與錄音畸冲,去河邊找鬼嫉髓。 笑死观腊,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的算行。 我是一名探鬼主播梧油,決...
    沈念sama閱讀 38,902評論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼州邢!你這毒婦竟也來了儡陨?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 37,662評論 0 266
  • 序言:老撾萬榮一對情侶失蹤量淌,失蹤者是張志新(化名)和其女友劉穎骗村,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體呀枢,經(jīng)...
    沈念sama閱讀 44,110評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡胚股,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,451評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了裙秋。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片琅拌。...
    茶點故事閱讀 38,577評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖摘刑,靈堂內(nèi)的尸體忽然破棺而出进宝,到底是詐尸還是另有隱情,我是刑警寧澤枷恕,帶...
    沈念sama閱讀 34,258評論 4 328
  • 正文 年R本政府宣布党晋,位于F島的核電站,受9級特大地震影響活尊,放射性物質(zhì)發(fā)生泄漏隶校。R本人自食惡果不足惜漏益,卻給世界環(huán)境...
    茶點故事閱讀 39,848評論 3 312
  • 文/蒙蒙 一蛹锰、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧绰疤,春花似錦铜犬、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,726評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至余爆,卻和暖如春纷宇,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背蛾方。 一陣腳步聲響...
    開封第一講書人閱讀 31,952評論 1 264
  • 我被黑心中介騙來泰國打工像捶, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留上陕,地道東北人。 一個月前我還...
    沈念sama閱讀 46,271評論 2 360
  • 正文 我出身青樓拓春,卻偏偏與公主長得像释簿,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子硼莽,可洞房花燭夜當晚...
    茶點故事閱讀 43,452評論 2 348

推薦閱讀更多精彩內(nèi)容

  • 什么是紋理 紋理是一個用來保存圖像的顏色色素值得OpenGL ES緩存, 紋理的作用是為了使我們渲染的幾何圖像更加...
    冰三尺閱讀 686評論 0 1
  • 一庶溶、紋理基礎 3D圖形渲染中最基本的操作就是對一個表面應用紋理。紋理可以表現(xiàn)只從網(wǎng)格的幾何形狀無法得到的附加細節(jié)懂鸵。...
    cain_huang閱讀 8,705評論 0 7
  • http://blog.csdn.net/wangdingqiaoit/article/details/51457...
    jerryhigh閱讀 5,312評論 0 8
  • 紋理的基礎知識 2D 紋理 2d紋理是OpenGlES中最基礎和普遍的一種紋理結構偏螺。一個2d紋理,就是圖片的數(shù)據(jù)的...
    Zsj_Sky閱讀 5,385評論 0 8
  • 紋理只是一種能夠應用到場景中的三角形上的圖像數(shù)據(jù)匆光,它通過經(jīng)過過濾的紋理單元(texel砖茸,相當于紋理的像素)填充到實...
    Gaolex閱讀 2,822評論 0 1