OpenGL入門學(xué)習(xí)——第九課 使用混合來實(shí)現(xiàn)半透明效果_第1頁
OpenGL入門學(xué)習(xí)——第九課 使用混合來實(shí)現(xiàn)半透明效果_第2頁
OpenGL入門學(xué)習(xí)——第九課 使用混合來實(shí)現(xiàn)半透明效果_第3頁
OpenGL入門學(xué)習(xí)——第九課 使用混合來實(shí)現(xiàn)半透明效果_第4頁
OpenGL入門學(xué)習(xí)——第九課 使用混合來實(shí)現(xiàn)半透明效果_第5頁
已閱讀5頁,還剩1頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

1、OpenGL入門學(xué)習(xí)第9課為了實(shí)現(xiàn)半透明效果而使用混合今天介紹有關(guān)OpenGL混合的基本知識。 混合是一種常見的技術(shù),通常用于實(shí)現(xiàn)半透明。 但是,實(shí)際上很靈活,可以根據(jù)設(shè)定得到不同的混合結(jié)果,可以生成一些有趣的圖像和奇怪的圖像。混合是什么呢?混合是把兩種顏色混合在一起。 具體地說,通過用某種方法混合某像素位置的原始顏色和將要描繪的顏色,實(shí)現(xiàn)特殊的效果。如果有必要畫一個通過紅色玻璃看到綠色物體的場景,先畫一個綠色物體,然后再畫紅色玻璃。 畫紅色玻璃時,利用“混合”功能,把畫的紅色和原始的綠色混合,得到新的顏色,玻璃看起來半透明。為了使用OpenGL的混合功能,只需調(diào)用glEnable(GL_BL

2、END )即可。要使OpenGL的混合功能無效,只需調(diào)用glDisable(GL_BLEND )即可。注意:混合功能僅在RGBA模式下可用。 在顏色索引模式下,混合功能不可用。一、源因子和目標(biāo)因子如前所述,混合需要找到原來的顏色和今后要描繪的顏色,用某種方法處理得到新的顏色。 這里描繪的顏色稱為“原色”,原來的顏色稱為“目標(biāo)顏色”。OpenGL分別檢索源顏色和目標(biāo)顏色,并將其乘以系數(shù)(與源顏色相乘的系數(shù)稱為源系數(shù),與目標(biāo)顏色相乘的系數(shù)稱為目標(biāo)系數(shù))。 (也可以不是加法。 新版本的OpenGL能夠設(shè)定加法、減法、取兩者中較大的一方、取兩者中較小的一方、邏輯運(yùn)算等的運(yùn)算方式,但是,由于此處很簡單,

3、所以不對此進(jìn)行討論)。讓我們用數(shù)學(xué)公式來表達(dá)這個計(jì)算方法。 將源色的4個成分(指紅、綠、藍(lán)、值)設(shè)為(Rs、Gs、Bs、As ),將目標(biāo)色的4個成分設(shè)為(Rd、Gd、Bd、Ad ),將源因子設(shè)為(Sr、Sg、Sb、Sa ),將目標(biāo)因子設(shè)為(Dr、Dg、Db、Da 通過混合生成的新顏色表示如下:即(Rs*Sr Rd*Dr,Gs*Sg Gd*Dg,Bs*Sb Bd*Db,As*Sa Ad*Da )當(dāng)然,如果有顏色的成分超過1.0,就會自動剪裁到1.0,而不考慮跨越邊界的問題。源和目標(biāo)可以用glBlendFunc函數(shù)設(shè)置。 glBlendFunc有兩個參數(shù),前者表示源系數(shù),后者表示目標(biāo)系數(shù)。 這兩個

4、參數(shù)可以有幾個值。 下面是一些常見的參數(shù).GL_ZERO :表示使用0.0作為系數(shù),實(shí)際上相當(dāng)于不使用此顏色參加混合運(yùn)算。GL_ONE :表示使用1.0作為因子,實(shí)際上相當(dāng)于完全使用此顏色參加混合運(yùn)算。GL_SRC_ALPHA :表示將源顏色的alpha值用作系數(shù)。GL_DST_ALPHA :指示將目標(biāo)顏色的alpha值用作系數(shù)。gl_one_具有_src_alpha :從源顏色的值減去1.0的值作為系數(shù)。gl_one_具有通過從_dst_alpha:1.0中減去目標(biāo)顏色而獲得的值作為系數(shù)。此外,還存在GL_SRC_COLOR (分別以源色的4個分量為因子的4個分量)、gl_one_所具有的G

5、L_SRC_COLOR、GL_DST_COLOR、gl_one_所具有的GL_DST_COLOR等,最初對于新版本的OpenGL,并沒有此限制,而是設(shè)置一種常量顏色,該顏色包含新的GL_CONST_COLOR分別作為系數(shù)),gl_one_為GL_CONST_COLOR、GL_CONST_ALPHA、GL _ o 還有GL_SRC_ALPHA_SATURATE。 在新版本的OpenGL中,顏色的alpha值和RGB值也可以使用不同的混合系數(shù)。 但是,這不是我們現(xiàn)在應(yīng)該知道的。 結(jié)果,這是入門教材,不需要太復(fù)雜例如,請執(zhí)行以下操作如果選擇了glBlendFunc(GL_ONE,GL_ZERO ),

6、則屏幕效果和不混合的情況會匹配(當(dāng)然,效率可能會稍有降低),因?yàn)樗耆褂迷搭伾耆皇褂媚繕?biāo)顏色。 如果未設(shè)置源系數(shù)和目標(biāo)系數(shù),則缺省情況下會設(shè)置。如果設(shè)定了glBlendFunc(GL_ZERO,GL_ONE ),則意味著完全不使用源顏色,所以無論您想畫什么,都不會在最后畫。 (但是,這樣設(shè)置并不是沒有用的,也有特殊的用途。)選擇設(shè)定了glBlendFunc(GL_SRC_ALPHA,gl_one_是_src_alpha )的情況,將源顏色乘以自己的值,將目標(biāo)顏色乘以1.0,減去源顏色的值在這種情況下,可以很容易地將源顏色的alpha值理解為“不透明度”。 這也是混合時最常用的方法。如果

7、選擇了glBlendFunc(GL_ONE,GL_ONE ),則完全使用源顏色和目標(biāo)顏色,最終顏色實(shí)際上是兩種顏色的簡單相加。 例如,紅色(1,0,0 )加綠色(0,1,0 )會變成黃色。注意:源顏色和目標(biāo)顏色與繪制的順序有關(guān)。 畫紅色物體,在上面畫綠色物體。 綠色是源顏色,紅色是目標(biāo)顏色。 順序相反時,紅色是源顏色,綠色是目標(biāo)顏色。 繪制時,請注意與設(shè)置了源顏色的源系數(shù)和設(shè)置了目標(biāo)顏色的目標(biāo)系數(shù)相對應(yīng)的順序。 不要按混亂的順序被迷惑。二、二維圖形的混合例讓我們看看一個簡單的例子。 可以把兩種不同的顏色混合在一起。 為了便于觀察,畫一個名為glRectf(-1,- 1,0.5,0.5 )的兩個

8、矩形glRectf(-0.5,- 0.5,1,1 ); 的雙曲正切值。 這兩個矩形具有觀察混合效果的區(qū)域。嘗試使用glBlendFunc(GL_ONE,GL_ZERO )。是,結(jié)果與不使用混合時相同。voidmomydisplay(void )舉止glClear(GL_COLOR_BUFFER_BIT );glEnable(GL_BLEND )glBlendFunc(GL_ONE,GL_ZERO )GL color 4f (1,0,0,0.5 )glRectf(-1,- 1,0.5,0.5 );GL color 4f (0,1,0,0.5 )glRectf(-0.5,- 0.5,1,1 );g

9、lutSwapBuffers ();以下嘗試將glBlendFunc的參數(shù)變更為glBlendFunc(GL_SRC_ALPHA,gl_one_為_src_alpha ),觀察glBlendFunc(GL_ONE,GL_ONE )效果。 第一個效果和不使用混合的效果相同,后面的圖形會復(fù)蓋先前繪制的圖形。 在第二種情況下,alpha被視為“不透明度”,并設(shè)置為0.5,因此兩個矩形都看起來是半透明的,或可以看到黑色背景。 第三,加上顏色,加上紅色和綠色變成黃色。三、實(shí)現(xiàn)三維混合你可能等不及畫出三維半透明物體的場景了。 但是,現(xiàn)在可能還不行。 另一個是在混合三維場景時必須注意的,即深度緩沖區(qū)。深度緩

10、沖區(qū)是記錄每個像素有多接近觀察者的數(shù)據(jù)。 啟用深度緩沖區(qū)測試后,如果要繪制的像素比原始像素更近,則會繪制像素。 否則,像素將被忽略,不會被繪制。 在繪制不透明物體時是非常有用的,無論是先繪制附近的物體,先繪制遠(yuǎn)處的物體,還是先繪制附近的物體,無論是以混亂的順序繪制,最后的顯示結(jié)果總是附近的物體隱藏遠(yuǎn)處的物體。但是,在需要實(shí)現(xiàn)半透明效果的時候,發(fā)現(xiàn)一切并不是那么美好。 如果描繪近距離的半透明物體,深度緩沖區(qū)中會保留信息,所以無法再描繪遠(yuǎn)處的物體。 半透明物體是半透明的,透過它看是不正確的內(nèi)容。為了解決上述問題,在繪制半透明物體時需要使深度緩沖器為只讀,而即使繪制半透明物體,深度緩沖器也保持原始狀

11、態(tài)。 如果另一個物體出現(xiàn)在半透明物體的后面,則可以畫在不透明物體的前面(因?yàn)樵摬煌该魑矬w的深度被記錄在深度緩沖器中)。 之后,當(dāng)要繪制不透明物體時,深度緩沖區(qū)可以設(shè)置為可讀寫的形式。 嗯? 怎么畫半透明的不透明的物體呢?這是把物體分成兩部分,一部分是半透明的,一部分是不透明的,只要分別畫就行了。即使使用以上技巧,我們也不能按混亂的順序畫出來。 首先需要畫不透明的物體,其次需要畫透明的物體。 否則,假設(shè)背景為藍(lán)色,附近有紅色玻璃,中間有綠色物體。 如果事先繪制紅色半透明玻璃,會與藍(lán)色背景混合,因此之后在繪制中間的綠色物體時,僅與紅色玻璃混合是無法實(shí)現(xiàn)的??偠灾?,描繪順序是首先描繪所有不透明的物

12、體。 只要兩個物體都不透明,誰先誰后都行。 然后,將深度緩沖區(qū)設(shè)置為只讀。 接下來,繪制所有半透明的物體。 如果兩個物體都是半透明的,誰先服從誰的意志就好(請注意,第一個畫的是“目標(biāo)顏色”,第二個畫的是“源顏色”。 因此,繪制的順序會影響結(jié)果)。 最后,將深度緩沖區(qū)設(shè)置為可讀寫的格式??梢詫⒄{(diào)用glDepthMask(GL_FALSE )的深度緩沖區(qū)設(shè)置為只讀。 可以將調(diào)用glDepthMask(GL_TRUE )的深度緩沖區(qū)設(shè)置為可讀寫的格式。一些網(wǎng)絡(luò)上的教程,包括著名的NeHe教程,選擇在使用三維混合時直接禁用深度緩沖區(qū),即調(diào)用glDisable(GL_DEPTH_TEST )。 這樣做不

13、正確。 如果繪制了不透明物體,然后在后面繪制了半透明物體,則后面的半透明物體不會顯示(隱藏在不透明物體中),但是如果關(guān)閉了深度緩沖區(qū),則深度緩沖區(qū)將保持可見并混合。 NeHe說,使用glDepthMask函數(shù)的話,一些顯卡可能有問題,但是由于我的經(jīng)驗(yàn)有限,可能沒有發(fā)現(xiàn)這種情況。那么,實(shí)際演示一下吧。 畫一個半透明不透明的球體吧。 假設(shè)球體是三個,紅色是不透明的,綠色是半透明的,藍(lán)色是半透明的。 紅色最遠(yuǎn),綠色中間,藍(lán)色最近。 如上所述,紅色不透明的球體必須首先繪制,綠色和藍(lán)色可以自由地重新排序。 在這里,為了表示不注意深度緩沖的設(shè)置的危害,故意畫了最近的藍(lán)色球體,然后畫了綠色球體。為了使這些球

14、體有一點(diǎn)立體感,用光。 將白色光源設(shè)定為(1,1,-1)。 代碼如下所示:void(voidsetlight )舉止靜態(tài)連接位置 = 1.0f,1.0f,-1.0f,1.0f;staticcontglfloatlight _ ambient = 0.2f、0.2f、0.2f、1.0f;staticcontglfloatlight _ diffuse = 1.0f,1.0f,1.0f;staticcontglfloatlight _ specular = 1.0f、1.0f、1.0f、1.0f;glLightfv(GL_LIGHT0,GL_POSITION,light_position )glL

15、ightfv(GL_LIGHT0,GL_AMBIENT,light_ambient )glLightfv(GL_LIGHT0,GL_DIFFUSE,light_diffuse )glLightfv(GL_LIGHT0,GL_SPECULAR,light_specular )glEnable(GL_LIGHT0)glEnable(GL_LIGHTING )glEnable(GL_DEPTH_TEST )以下每個球體顏色不同。 材質(zhì)也不同。 在此,用函數(shù)設(shè)定材質(zhì)。voidsetmatirial (constglflotmat _ diffuse 4、GLfloatmat_shininess )舉止

16、staticcontglfloatat _ specular = 0.0f,0.0f,0.0f,1.0f;staticcontglfloatat _ emission = 0.0f,0.0f,0.0f,1.0f;glMaterialfv(GL_FRONT,GL_AMBIENT_AND_DIFFUSE,mat_diffuse )glMaterialfv(GL_FRONT,GL_SPECULAR,mat_specular )glMaterialfv(GL_FRONT,GL_EMISSION,mat_emission )glMaterialf(GL_FRONT、GL_SHININESS、mat_shininess )以下有了這兩個函數(shù),我們就可以基于以前的知識來寫整個程序代碼。 這里只表示描繪的部分,其他部分可以自己做。voidmomydisplay(void )舉止/定義幾種材質(zhì)的顏色conststaticglfloatred _ color = 1.0f,0.0f,0.0f,1.0f;conststaticglfloatgreen _ color = 0.0f,1.0f,0.0f,0.3333f;conststaticglfloatblue _ color = 0.0f,0.0f,1.0f,0.5

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論