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.