freepeople性欧美熟妇, 色戒完整版无删减158分钟hd, 无码精品国产vα在线观看DVD, 丰满少妇伦精品无码专区在线观看,艾栗栗与纹身男宾馆3p50分钟,国产AV片在线观看,黑人与美女高潮,18岁女RAPPERDISSSUBS,国产手机在机看影片

正文內(nèi)容

opengl游戲程序設(shè)計(jì)-資料下載頁(yè)

2025-01-09 01:51本頁(yè)面
  

【正文】 就沒(méi)有執(zhí)行任何紋理操作,這樣的分離就沒(méi)有任何意義)。 六、最后的準(zhǔn)備 到現(xiàn)在可以說(shuō)是完事俱備了。不過(guò),OpenGL默認(rèn)是關(guān)閉光照處理的。要打開(kāi)光照處理功能,使用下面的語(yǔ)句: glEnable(GL_LIGHTING)。 要關(guān)閉光照處理功能,使用glDisable(GL_LIGHTING)。即可。 示例 第八章 紋理映射 啟用紋理和載入紋理 就像我們?cè)?jīng)學(xué)習(xí)過(guò)的 OpenGL光照一樣。在使用紋理前,必須啟用它。 OpenGL支持一維紋理、二維紋理和三維紋理,這里我們僅介紹二維紋理??梢允褂靡韵抡Z(yǔ)句來(lái)啟用和禁用二維紋理: glEnable(GL_TEXTURE_2D)。 // 啟用二維紋理 glDisable(GL_TEXTURE_2D)。 // 禁用二維紋理 使用紋理前,還必須載入紋理。利用glTexImage2D函數(shù)可以載入一個(gè)二維的紋理,該函數(shù)有多達(dá)九個(gè)參數(shù)(雖然某些參數(shù)我們可以暫時(shí)不去了解),現(xiàn)在分別說(shuō)明如下: 第一個(gè)參數(shù)為指定的目標(biāo),對(duì)于二維紋理這個(gè)參數(shù)使用 GL_TEXTURE_2D。 第二個(gè)參數(shù)為“多重細(xì)節(jié)層次”,現(xiàn)在我們并不考慮多重紋理細(xì)節(jié),因此這個(gè)參數(shù)設(shè)置為零。 第三個(gè)參數(shù)有兩種用法。在 OpenGL ,即最初的版本中,使用整數(shù)來(lái)表示顏色分量數(shù)目,例如:像素?cái)?shù)據(jù)用 RGB顏色表示,總共有紅、綠、藍(lán)三個(gè)值,因此參數(shù)設(shè)置為 3,而如果像素?cái)?shù)據(jù)是用RGBA顏色表示,總共有紅、綠、藍(lán)、alpha四個(gè)值,因此參數(shù)設(shè)置為 4。而在后來(lái)的版本中,可以直接使用 GL_RGB或GL_RGBA來(lái)表示以上情況,顯得更直觀。 第四、五個(gè)參數(shù)是二維紋理像素的寬度和高度。 使用紋理時(shí)要特別注意其大小。盡量使用大小為 2的整數(shù)次方的紋理,當(dāng)這個(gè)要求無(wú)法滿(mǎn)足時(shí),使用 gluScaleImage函數(shù)把圖象縮放至所指定的大小 無(wú)論舊版本還是新版本,都限制了紋理大小的最大值,例如,某 OpenGL實(shí)現(xiàn)可能要求紋理最大不能超過(guò) 1024*1024??梢允褂萌缦碌拇a來(lái)獲得 OpenGL所支持的最大紋理: GLint max。 glGetIntegerv(GL_MAX_TEXTURE_SIZE, amp。max)。 第六個(gè)參數(shù)是紋理邊框的大小,我們沒(méi)有使用紋理邊框,因此這里設(shè)置為零。 第七個(gè)參數(shù)表示讀取的內(nèi)容,例如: GL_RGB就會(huì)依次讀取像素的紅、綠、藍(lán)三種數(shù)據(jù),GL_RGBA則會(huì)依次讀取像素的紅、綠、藍(lán)、alpha四種數(shù)據(jù), GL_RED則只讀取像素的紅色數(shù)據(jù)(類(lèi)似的還有 GL_GREEN, GL_BLUE,以及 GL_ALPHA)。 第八個(gè)參數(shù)表示讀取的內(nèi)容保存到內(nèi)存時(shí)所使用的格式,例如: GL_UNSIGNED_BYTE會(huì)把各種數(shù)據(jù)保存為 GLubyte, GL_FLOAT會(huì)把各種數(shù)據(jù)保存為 GLfloat等。 第九個(gè)參數(shù)表示一個(gè)指針,像素?cái)?shù)據(jù)被讀取后,將被保存到這個(gè)指針?biāo)硎镜牡刂贰? 舉個(gè)例子,如果有一幅大小為 width*height,格式為 Windows系統(tǒng)中使用最普遍的 24位 BGR,保存在 pixels中的像素圖象。則把這樣一幅圖象載入為紋理可使用以下代碼: glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, width, height, 0, GL_BGR_EXT, GL_UNSIGNED_BYTE, pixels)。 注意,載入紋理的過(guò)程可能比較慢,原因是紋理數(shù)據(jù)通常比較大,例如一幅512*512的 BGR格式的圖象,大小為。把這些像素?cái)?shù)據(jù)從主內(nèi)存?zhèn)魉偷綄?zhuān)門(mén)的圖形硬件,這個(gè)過(guò)程中還可能需要把程序中所指定的像素格式轉(zhuǎn)化為圖形硬件所能識(shí)別的格式(或最能發(fā)揮圖形硬件性能的格式),這些操作都需要較多時(shí)間。 紋理坐標(biāo) 指定每一個(gè)頂點(diǎn)在紋理圖象中所對(duì)應(yīng)的像素位置,OpenGL就會(huì)自動(dòng)計(jì)算頂點(diǎn)以外的其它點(diǎn)在紋理圖象中所對(duì)應(yīng)的像素位置。 我們可以這樣類(lèi)比一下:在繪制一條線段時(shí),我們?cè)O(shè)置其中一個(gè)端點(diǎn)為紅色,另一個(gè)端點(diǎn)為綠色,則OpenGL會(huì)自動(dòng)計(jì)算線段中其它各像素的顏色,如果是使用 glShadeMode(GL_SMOOTH)。,則最終會(huì)形成一種漸變的效果(例如線段中點(diǎn),就是紅色和綠色的中間色)。類(lèi)似的,在繪制一條線段時(shí),我們?cè)O(shè)置其中一個(gè)端點(diǎn)使用“紋理圖象中最左下角的顏色”作為它的顏色,另一個(gè)端點(diǎn)使用“紋理圖象中最右上角的顏色”作為它的顏色,則 OpenGL會(huì)自動(dòng)在紋理圖象中選擇合適位置的顏色,填充到線段的各個(gè)像素(例如線段中點(diǎn),可能就是選擇紋理圖象中央的那個(gè)像素的顏色)。 在類(lèi)比時(shí),使用了“紋理圖象中最左下角的顏色”這種說(shuō)法。但這種說(shuō)法在很多時(shí)候不夠精確,我們需要一種精確的方式來(lái)表示我們究竟使用紋理中的哪個(gè)像素。紋理坐標(biāo)也就是因?yàn)檫@樣的要求而產(chǎn)生的。以二維紋理為例,規(guī)定紋理最左下角的坐標(biāo)為 (0, 0),最右上角的坐標(biāo)為 (1, 1),于是紋理中的每一個(gè)像素的位置都可以用兩個(gè)浮點(diǎn)數(shù)來(lái)表示(三維紋理會(huì)用三個(gè)浮點(diǎn)數(shù)表示,一維紋理則只用一個(gè)即可)。 使用 glTexCoord*系列函數(shù)來(lái)指定紋理坐標(biāo)。這些函數(shù)的用法與使用 glVertex*系列函數(shù)來(lái)指定頂點(diǎn)坐標(biāo)十分相似。例如: glTexCoord2f(, )。指定使用 (0, 0)紋理坐標(biāo)。 通常,每個(gè)頂點(diǎn)使用不同的紋理,于是下面這樣形式的代碼是比較常見(jiàn)的。 glBegin( /* ... */ )。 glTexCoord2f( /* ... */ )。 glVertex3f( /* ... */ )。 glTexCoord2f( /* ... */ )。 glVertex3f( /* ... */ )。 /* ... */ glEnd()。 紋理參數(shù) 在使用紋理前還有某些參數(shù)是必須設(shè)置的。 使用 glTexParameter*系列函數(shù)來(lái)設(shè)置紋理參數(shù)。通常需要設(shè)置下面四個(gè)參數(shù): GL_TEXTURE_MAG_FILTER:指當(dāng)紋理圖象被使用到一個(gè)大于它的形狀上時(shí)(即:有可能紋理圖象中的一個(gè)像素會(huì)被應(yīng)用到實(shí)際繪制時(shí)的多個(gè)像素。例如將一幅 256*256的紋理圖象應(yīng)用到一個(gè) 512*512的正方形),應(yīng)該如何處理。可選擇的設(shè)置有 GL_NEAREST和 GL_LINEAR,前者表示“使用紋理中坐標(biāo)最接近的一個(gè)像素的顏色作為需要繪制的像素顏色”,后者表示“使用紋理中坐標(biāo)最接近的若干個(gè)顏色,通過(guò)加權(quán)平均算法得到需要繪制的像素顏色”。 GL_TEXTURE_MIN_FILTER:指當(dāng)紋理圖象被使用到一個(gè)小于(或等于)它的形狀上時(shí)(即有可能紋理圖象中的多個(gè)像素被應(yīng)用到實(shí)際繪制時(shí)的一個(gè)像素。例如將一幅 256*256的紋理圖象應(yīng)用到一個(gè) 128*128的正方形),應(yīng)該如何處理??蛇x擇的設(shè)置有 GL_NEAREST,GL_LINEAR,GL_NEAREST_MIPMAP_NEAREST,GL_NEAREST_MIPMAP_LINEAR,GL_LINEAR_MIPMAP_NEAREST和GL_LINEAR_MIPMAP_LINEAR。其中后四個(gè)涉及到 mipmap,現(xiàn)在暫時(shí)不需要了解。前兩個(gè)選項(xiàng)則和 GL_TEXTURE_MAG_FILTER中的類(lèi)似。 GL_TEXTURE_WRAP_S:指當(dāng)紋理坐標(biāo)的第一維坐標(biāo)值大于 ,應(yīng)該如何處理?;镜倪x項(xiàng)有 GL_CLAMP和 GL_REPEAT,前者表示“截?cái)唷?,即超過(guò) ,不足 。后者表示“重復(fù)”,即對(duì)坐標(biāo)值加上一個(gè)合適的整數(shù)(可以是正數(shù)或負(fù)數(shù)),得到一個(gè)在 [, ]范圍內(nèi)的值,然后用這個(gè)值作為新的紋理坐標(biāo)。例如:某二維紋理,在繪制某形狀時(shí),一像素需要得到紋理中坐標(biāo)為 (, )的像素的顏色,其中第一維的坐標(biāo)值 ,則在 GL_CLAMP方式中將被轉(zhuǎn)化為 (, ),在 GL_REPEAT方式中將被轉(zhuǎn)化為 (, )。 GL_TEXTURE_WRAP_T:指當(dāng)紋理坐標(biāo)的第二維坐標(biāo)值大于 ,應(yīng)該如何處理。選項(xiàng)與GL_TEXTURE_WRAP_S類(lèi)似,不再重復(fù)。如果不指定這個(gè)參數(shù),則默認(rèn)為GL_REPEAT。 glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT)。 紋理對(duì)象 前面已經(jīng)提到過(guò),載入一幅紋理所需要的時(shí)間是比較多的。因此應(yīng)該盡量減少載入紋理的次數(shù)。如果只有一幅紋理,則應(yīng)該在第一次繪制前就載入它,以后就不需要再次載入了。 但是,在每次繪制時(shí)要使用兩幅或更多幅的紋理時(shí),這個(gè)辦法就行不通了。你可能會(huì)編寫(xiě)下面的代碼: glTexImage2D( /* ... */ )。 // 載入第一幅紋理 // 使用第一幅紋理 glTexImage2D( /* ... */ )。 // 載入第二幅紋理 // 使用第二幅紋理 // 當(dāng)紋理的數(shù)量增加時(shí),這段代碼會(huì)變得更加復(fù)雜。 在繪制動(dòng)畫(huà)時(shí),由于每秒鐘需要將畫(huà)面繪制數(shù)十次,因此如果使用上面的代碼,就會(huì)反復(fù)載入紋理,這對(duì)計(jì)算機(jī)是非常大的負(fù)擔(dān),以目前的個(gè)人計(jì)算機(jī)配置來(lái)說(shuō),根本就無(wú)法讓動(dòng)畫(huà)能夠流暢的運(yùn)行。因此,需要有一種機(jī)制,能夠在不同的紋理之間進(jìn)行快速的切換。 紋理對(duì)象正是這樣一種機(jī)制。我們可以把每一幅紋理(包括紋理的像素?cái)?shù)據(jù)、紋理大小等信息,也包括了前面所講的紋理參數(shù))放到一個(gè)紋理對(duì)象中,通過(guò)創(chuàng)建多個(gè)紋理對(duì)象來(lái)達(dá)到同時(shí)保存多幅紋理的目的。這樣一來(lái),在第一次使用紋理前,把所有的紋理都載入,然后在繪制時(shí)只需要指明究竟使用哪一個(gè)紋理對(duì)象就可以了。 使用一個(gè)正整數(shù)來(lái)作為紋理對(duì)象的編號(hào)。在使用前,可以調(diào)用 glGenTextures來(lái)分配紋理對(duì)象。該函數(shù)有兩種比較常見(jiàn)的用法: GLuint texture_ID。 glGenTextures(1, amp。texture_ID)。 // 分配一個(gè)紋理對(duì)象的編號(hào) 或者 GLuint texture_ID_list[5]。 glGenTextures(5, texture_ID_list)。 // 分配 5個(gè)紋理對(duì)象的編號(hào) 在分配了紋理對(duì)象編號(hào)后,使用 glBindTexture函數(shù)來(lái)指定“當(dāng)前所使用的紋理對(duì)象”。然后就可以使用 glTexImage*系列函數(shù)來(lái)指定紋理像素、使用 glTexParameter*系列函數(shù)來(lái)指定紋理參數(shù)、使用 glTexCoord*系列函數(shù)來(lái)指定紋理坐標(biāo)了。如果不使用 glBindTexture函數(shù),那么glTexImage*、 glTexParameter*、 glTexCoord*系列函數(shù)默認(rèn)在一個(gè)編號(hào)為 0的紋理對(duì)象上進(jìn)行操作。 glBindTexture函數(shù)有兩個(gè)參數(shù),第一個(gè)參數(shù)是需要使用紋理的目標(biāo),因?yàn)槲覀儸F(xiàn)在只學(xué)習(xí)二維紋理,所以指定為 GL_TEXTURE_2D,第二個(gè)參數(shù)是所使用的紋理的編號(hào)。 使用多個(gè)紋理對(duì)象,就可以使 OpenGL同時(shí)保存多個(gè)紋理。在使用時(shí)只需要調(diào)用 glBindTexture函數(shù),在不同紋理之間進(jìn)行切換,而不需要反復(fù)載入紋理,因此動(dòng)畫(huà)的繪制速度會(huì)有非常明顯的提升。典型的代碼如下所示: // 在程序開(kāi)始時(shí):分配好紋理編號(hào),并載入紋理 glGenTextures( /* ... */ )。 glBindTexture(GL_TEXTURE_2D, texture_ID_1)。 // 載入第一幅紋理 glBindTexture(GL_TEXTURE_2D, texture_ID_2)。 // 載入第二幅紋理
點(diǎn)擊復(fù)制文檔內(nèi)容
教學(xué)課件相關(guān)推薦
文庫(kù)吧 www.dybbs8.com
備案圖鄂ICP備17016276號(hào)-1