青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

醬壇子

專(zhuān)注C++技術(shù) 在這里寫(xiě)下自己的學(xué)習(xí)心得 感悟 和大家討論 共同進(jìn)步(歡迎批評(píng)!!!)

  C++博客 :: 首頁(yè) :: 聯(lián)系 :: 聚合  :: 管理
  66 Posts :: 16 Stories :: 236 Comments :: 0 Trackbacks

公告

王一偉 湖南商學(xué)院畢業(yè) 電子信息工程專(zhuān)業(yè)

常用鏈接

留言簿(19)

我參與的團(tuán)隊(duì)

搜索

  •  

積分與排名

  • 積分 - 389905
  • 排名 - 64

最新隨筆

最新評(píng)論

閱讀排行榜

評(píng)論排行榜

對(duì)作者心血表示感謝,先附上原文:http://www.86vr.com/teach/cursor/200410/3841.html
實(shí)時(shí)3D繪圖的陰影效果
目 錄

  1 平面陰影
  2 體積陰影


附帶的源程序(91KB)

  在目前的實(shí)時(shí)3D繪圖中,要做出真實(shí)的陰影效果,是很不容易的。因?yàn)殛幱笆且蛭矬w遮住光源所產(chǎn)生的,因此,要做出正確的陰影效果,就需要對(duì)整個(gè)場(chǎng)景做處理,這樣才能判斷出哪些物體被哪些物體遮住了。

  不過(guò),目前的3D硬件,并不容易進(jìn)行這類(lèi)的測(cè)試,因?yàn)橘Y料量和工作量都太大了。不過(guò),這并不表示使用現(xiàn)在的3D硬件就無(wú)法做出陰影。現(xiàn)在已經(jīng)有很多方法是適合用在目前的3D硬件上面,可以產(chǎn)生效果不錯(cuò)的陰影。本文會(huì)就一些常用的方法,做簡(jiǎn)單的介紹。


1、平面陰影

  目前常用的方法,幾乎都是把陰影看成是“物體投射到其它表面”來(lái)處理。在光源是平行光的時(shí)候(例如,太陽(yáng)光),可以看成是物體把陰影“投射”到另一個(gè)表面上,如下圖所示:

  如果場(chǎng)景中只有一個(gè)重要的光源(即最強(qiáng)的光源),那可以假設(shè)只有這個(gè)光源會(huì)產(chǎn)生明顯的陰影。以平行光源來(lái)說(shuō),要把陰影“投射”到一個(gè)平面上,就是一件相當(dāng)容易的事。

  設(shè)空間有一點(diǎn)V,平行光源的方向是L,要投射陰影的平面是P,那么,存在一常數(shù)k使

  成立,如下圖(V、L、和 P均為四維向量,表示一個(gè)三維的齊次坐標(biāo):homogeneous coordinate):

  解上式得

  空間中的點(diǎn)V投影到平面P的位置是V+kP。對(duì)一個(gè)3D模型(model)的每個(gè)頂點(diǎn)都代入這個(gè)式子,就可以得到投影的結(jié)果了。不過(guò),因?yàn)槟壳暗?D硬件都是以4×4的矩陣來(lái)做變換,所以如果能把投影的動(dòng)作寫(xiě)成一個(gè)矩陣,就會(huì)方便很多。

  設(shè)V = <Vx, Vy, Vz, 1>,L = <Lx, Ly, Lz, 0>,P = <a, b, c, d>;展開(kāi)前面的式子,會(huì)發(fā)現(xiàn)k有一個(gè)分母:

  因此這個(gè)式子會(huì)有點(diǎn)復(fù)雜。不過(guò),因?yàn)樵贠penGL中的向量都是齊次坐標(biāo)(homogeneous coordinate),所以可以先把分母提出來(lái),放到w中。對(duì)Vx展開(kāi)得到:

整理一下得到

  這樣就變成向量?jī)?nèi)積的形式,可以放到矩陣中。對(duì)Vy和Vz做同樣的動(dòng)作,再加上放到w的分母部分,就可以得到下面的矩陣:

  因此,理論上,要畫(huà)陰影時(shí),把MODELVIEW矩陣設(shè)成上面的矩陣,畫(huà)出物體,就會(huì)是陰影的樣子。

  上面討論的是以平行光源為主。如果光源是點(diǎn)光源,也可以用類(lèi)似的方法來(lái)做。

  這個(gè)方法可以對(duì)任何平面做出陰影的效果。如果有多個(gè)平面,可以分別對(duì)每個(gè)平面都做一次。不過(guò),這個(gè)方法顯然是沒(méi)辦法把陰影投影到曲面上。所以,這個(gè)方法通常稱(chēng)為平面陰影(planar shadow)。

  理論的部分已經(jīng)討論完了。不過(guò),實(shí)作的時(shí)候,還有一些細(xì)節(jié)部分是需要特別注意的。

  首先,如果真的直接用上面的方法來(lái)做,那做出來(lái)的結(jié)果可能會(huì)像這樣:

  這是因?yàn)楫?huà)了圖中的地板之后,再畫(huà)黑色的陰影時(shí),會(huì)和地板產(chǎn)生所謂的Z fighting現(xiàn)象,也就是陰影的一部分的Z值較地板的Z值小,所以會(huì)畫(huà)出來(lái),但是有些部分的Z值則可能比地板的Z值大,所以就沒(méi)畫(huà)出來(lái)了。這種現(xiàn)象會(huì)使得陰影變得破碎不完整。

  現(xiàn)在的3D硬件通常提供一個(gè)叫多邊形偏移(polygon offset)的功能,用來(lái)解決Z fighting的問(wèn)題。多邊形偏移的原理,是在畫(huà)一個(gè)物體時(shí),要求把它的Z值進(jìn)行一個(gè)小的調(diào)整。例如,在上面的例子中,我們可以把陰影的Z值減一個(gè)小的數(shù)字,這樣就可以避免Z fighting的現(xiàn)象。

  處理掉Z fighting后,再來(lái)是第二個(gè)問(wèn)題:

  上圖中,陰影跑到地板的外面去了。這里需要一個(gè)方法,把陰影切到地板的范圍內(nèi)。這個(gè)例子中,地板的邊界是直線,所以可以用user defined clip planes來(lái)做。不過(guò),如果地板是奇怪的形狀,就需要?jiǎng)e的方法。

  而且,光是把陰影切到地板的范圍內(nèi)是不夠的。通常陰影是用blending的方式畫(huà)上去的。如果一個(gè)物體的形狀比較復(fù)雜,那有些地方可能會(huì)blend兩次或更多次。這樣會(huì)讓陰影看起來(lái)不是同一個(gè)顏色,即有些地方顏色較深而有些地方較淺。

  現(xiàn)在的3D硬件多半支持模板緩沖區(qū)(stencil buffer)。模板緩沖區(qū)是一個(gè)用來(lái)“做記號(hào)”的緩沖區(qū)。通常模板緩沖區(qū)可以存放1 bits到8 bits不等的數(shù)字,不同的硬件支持的大小會(huì)不一樣。目前的3D硬件通常把模板緩沖區(qū)和Z buffer放在一起。例如,它可能支持15 bits的Z buffer加上1 bit的模板緩沖區(qū);或是支持24 bits的Z buffer加上8 bit的模板緩沖區(qū)。因此,通常模板緩沖區(qū)的測(cè)試是和Z測(cè)試一起做的,也就是在使用Z buffer時(shí),模板緩沖區(qū)可說(shuō)是“免費(fèi)”的。

  在我們的例子中,可以先把模板緩沖區(qū)(stencil buffer)全清為0。在畫(huà)地板之前,把模板緩沖區(qū)設(shè)定為“當(dāng)Z測(cè)試通過(guò)時(shí),把模板的值設(shè)為1”。這樣一來(lái),畫(huà)完地板之后,地板所占有的那些像素的模板值就都會(huì)是1,其它的地方還是0。現(xiàn)在,把模板緩沖區(qū)設(shè)定成“當(dāng)Z測(cè)試通過(guò)時(shí),若模板的值為1才畫(huà),且將模板的值設(shè)為0”。然后開(kāi)始畫(huà)陰影。這樣畫(huà)出來(lái)的陰影,一定會(huì)在地板的范圍內(nèi),而且每個(gè)像素只會(huì)被畫(huà)一次,不會(huì)出現(xiàn)blend兩次的情形。

  如果有多個(gè)平面要投影,可以為每個(gè)平面指定不同的模板(stencil)值。不過(guò),如果模板緩沖區(qū)(stencil buffer)只有1 bit,那就沒(méi)辦法了。這時(shí),可能就需要在畫(huà)下一個(gè)平面之前,先把模板緩沖區(qū)清掉,這樣會(huì)花很多時(shí)間。

  下圖是一個(gè)完整的例子:

  參考程序你可以去試驗(yàn)。這個(gè)程序需要至少2 bits的模板緩沖區(qū)(stencil buffer)支持。

  平面陰影(Planar shadow)就差不多是這個(gè)樣子了。平面陰影的好處是簡(jiǎn)單、容易做,而且在投影面不多的時(shí)候,速度很快。但是,當(dāng)投影面變多時(shí),或是物體很復(fù)雜時(shí),速度很快就會(huì)變得很慢,因?yàn)閷?duì)每個(gè)平面都需要把投影的物體再畫(huà)一次。而且,它只能投影在平面上,對(duì)于不規(guī)則的表面則完全沒(méi)辦法。

  還有一些別的方法可以產(chǎn)生陰影的效果。后面還會(huì)再討論一些產(chǎn)生陰影的方式,都可以投影在任何不規(guī)則的表面上。

2、體積陰影

  前面所介紹的方法,即平面陰影(Planar shadow),只適用于平面上。但是,除了少數(shù)的情形之外,絕大多數(shù)的情形下,根本無(wú)法預(yù)測(cè)陰影會(huì)被投射在什么樣的表面上。所以,我們需要自由度更高的方法。

  在這里介紹一個(gè)較為靈活的方法,它可以將陰影投射在不規(guī)則的表面上。這個(gè)方法稱(chēng)為體積陰影(Volumetric Shadow)。這個(gè)方法的動(dòng)點(diǎn)在于,它并不是利用“把物體投影到表面”的方式來(lái)產(chǎn)生陰影,而是去找出場(chǎng)景中,有哪些像素是在陰影中。也就是說(shuō),想象一個(gè)物體擋住光時(shí),在物體的后面會(huì)形成一個(gè)大的“陰影錐”。很明顯的,若一個(gè)像素在“陰影錐”之中,那它就是在陰影之中。如下圖所示:

  上圖中的紅色球體,在受光照后,在后方產(chǎn)生一個(gè)“陰影錐”,即Shadow Volume,而這個(gè)“陰影錐”和灰色平面的交集,就是陰影會(huì)出現(xiàn)的地方。

  所以,基本上體積陰影(Volumetric Shadow)的原理是很簡(jiǎn)單的。不過(guò),要真正實(shí)作又是另一回事。為了簡(jiǎn)單起見(jiàn),這里先以一個(gè)簡(jiǎn)單的三角形開(kāi)始。目前的3D繪圖幾乎都是以三角形為基礎(chǔ),所以從三角形開(kāi)始,應(yīng)該是很適當(dāng)?shù)摹?

  現(xiàn)在,假設(shè)有一個(gè)已經(jīng)繪制完成的3D場(chǎng)景。因?yàn)槭褂肸 buffer的關(guān)系,對(duì)每一個(gè)像素而言,都有一個(gè)相對(duì)的Z值,即表示該像素和觀察者的距離的值。如果現(xiàn)在有一個(gè)三角面,把陰影投射到這個(gè)3D場(chǎng)景中,并畫(huà)出這個(gè)三角面的“陰影錐”。因?yàn)槲矬w是一個(gè)三角形,所以它的“陰影錐”也是一個(gè)三角錐。這時(shí),要如何知道3D場(chǎng)景中,有哪些像素是和這個(gè)三角錐有交集?

  其實(shí)方法很簡(jiǎn)單。想象許多射線,由觀察者射向每個(gè)像素。如果射線和“陰影錐”完全沒(méi)有交集,它所對(duì)應(yīng)的像素當(dāng)然就不會(huì)和“陰影錐”有交集。不過(guò),即使是射線和“陰影錐”有交集,并不一定表示該像素就一定和“陰影錐”有交集,因?yàn)樯渚€可能會(huì)射入“陰影錐”后又射出。所以,只有在射線射入“陰影錐”之后,在離開(kāi)“陰影錐”之前就遇到其對(duì)應(yīng)的像素時(shí),才表示這個(gè)像素和“陰影錐”有交集。下圖顯示出各種不同的情形:

  上圖中的(1)和(2)都是面對(duì)觀察者的面,所以它們所涵蓋的像素,就是“射線會(huì)射入陰影錐”的像素。而(3)則是背對(duì)觀察者的面,所以它所涵蓋的像素是“射線會(huì)離開(kāi)陰影錐”的像素。所以,會(huì)和陰影錐有交集的像素,就是(1)+(2)-(3)的那些像素,也就是陰影所在的位置。

  不過(guò),要怎么在一般的3D繪圖硬件中,得到(1)+(2)-(3)的結(jié)果呢?和平面陰影(Planar shadow)一樣,這需要模板緩沖區(qū)(stencil buffer)。在OpenGL和Direct3D中的模板緩沖區(qū)都可以讓它進(jìn)行“加一”和“減一”的動(dòng)作。所以,只要把模板緩沖區(qū)設(shè)定成:在繪制(1)和(2)的面時(shí),讓模板緩沖區(qū)加一;而在繪制(3)的面時(shí),讓 模板緩沖區(qū)減一。這樣一來(lái),在畫(huà)完(1)~(3)時(shí),那些模板(stencil)值不為0的像素就是陰影了。最后,把所有模板不為0的像素利用alpha blending的方式,使其亮度降低,就可以達(dá)到繪制陰影的效果。

  上面的例子是用一個(gè)三角面。對(duì)于比較復(fù)雜的物體,其原理還是一樣的。當(dāng)物體是由許多三角面組成時(shí),可以把所有面對(duì)光源的三角面都進(jìn)行上面的動(dòng)作,就可以產(chǎn)生陰影。不過(guò),這樣有個(gè)缺點(diǎn):因?yàn)楹芏嗳敲娴倪吺墙釉谝黄鸬模赃@樣做會(huì)十分浪費(fèi)時(shí)間。要提高效率其實(shí)也很容易。在繪制“陰影錐”的時(shí)候,若有一個(gè)邊是被兩個(gè)三角面所共享,那就表示這是一個(gè)“內(nèi)部”的邊,在繪制“陰影錐”的時(shí)候,就可以不用去畫(huà)這個(gè)邊。這樣就可以省下不少的時(shí)間。

  這個(gè)方法適用于非常復(fù)雜的物體。不過(guò),它還是可能會(huì)遇上一些問(wèn)題。一個(gè)情形是,如果觀察者在“陰影錐”的內(nèi)部,會(huì)發(fā)生一些麻煩的情形。不過(guò),對(duì)大部分的情形來(lái)說(shuō),只要將模板緩沖區(qū)(stencil buffer)設(shè)定成“減到0就停止”,即0 - 1 = 0,就可以解決。當(dāng)然這無(wú)法解決所有的問(wèn)題,不過(guò)通常已經(jīng)夠好了。另外,如果物體不是 convex(即“凸”的),那可能會(huì)出現(xiàn)“射線重復(fù)進(jìn)入陰影錐”的情形。這種情形并不會(huì)有問(wèn)題,不過(guò)模板緩沖區(qū)就需要比較多bit才不會(huì)出錯(cuò)。一般來(lái)說(shuō),4 bits就已經(jīng)可以處理絕大多數(shù)的物體的。

  下面的畫(huà)面是體積陰影(Volumetric Shadow)的結(jié)果,是由DirectX 8 SDK中的一個(gè)示范程序所產(chǎn)生的。這個(gè)程序的結(jié)構(gòu)并不復(fù)雜,所以有興趣的話,可以自行參考它的原始碼。

  這個(gè)方法比平面陰影(Planar shadow)更能適用于不同的場(chǎng)景。不過(guò),它當(dāng)然也有缺點(diǎn)。最主要的缺點(diǎn)是在于它的復(fù)雜度。要做出有效率的“陰影錐”,需要對(duì)物體做相當(dāng)麻煩的處理,基本上就是要找出物體在某個(gè)方向的“外緣”(即silhouette)。雖然這并不太難做,但是還是需要花費(fèi)相當(dāng)?shù)腃PU時(shí)間去處理。另外,為所有的物體繪制出其“陰影錐”,需要相當(dāng)大量的填充率(fill rate)和內(nèi)存頻寬。若是延后渲染(deferred renderer),例如圖素渲染(tile renderer)則影響不會(huì)這么大,特別是圖素渲染可以支持一些特別的功能,來(lái)加速體積陰影(Volumetric Shadow)的動(dòng)作。

  基本上,體積陰影(Volumetric Shadow)的效果,一般來(lái)說(shuō)都不錯(cuò)。最主要的缺點(diǎn)則是在效率方面,特別是當(dāng)物體的復(fù)雜度和數(shù)量增加時(shí),CPU需要的工作量會(huì)大增,是較為不理想的。后面會(huì)再介紹一些速度更快的方法。
posted on 2009-03-27 11:11 @王一偉 閱讀(2862) 評(píng)論(0)  編輯 收藏 引用

只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。
網(wǎng)站導(dǎo)航: 博客園   IT新聞   BlogJava   博問(wèn)   Chat2DB   管理


青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            久久国产99| aa日韩免费精品视频一| 欧美日韩网站| 久久免费高清| 亚洲欧美一区二区在线观看| 亚洲精品视频二区| 欧美成人国产一区二区| 欧美一级免费视频| 亚洲图片欧美一区| 亚洲精品乱码久久久久久按摩观| 国产香蕉久久精品综合网| 欧美午夜a级限制福利片| 美女视频黄免费的久久| 久久黄色影院| 欧美一区二区精美| 亚洲欧美综合v| 一本高清dvd不卡在线观看| 亚洲欧洲视频| 亚洲国产精品一区二区尤物区| 久热re这里精品视频在线6| 久久精品国产亚洲高清剧情介绍| 午夜精品久久久久久久久久久| 一本色道88久久加勒比精品| 亚洲人在线视频| 亚洲人成在线观看一区二区| **网站欧美大片在线观看| 尤妮丝一区二区裸体视频| 狠狠狠色丁香婷婷综合久久五月| 国产日韩成人精品| 国产日韩欧美在线看| 国产亚洲综合精品| 国产一区二区三区在线观看网站 | 国产精品激情偷乱一区二区∴| 欧美另类变人与禽xxxxx| 欧美激情亚洲| 欧美日韩一区二区三区在线看| 欧美午夜不卡视频| 国产精品欧美日韩一区| 国产精品永久入口久久久| 国产欧美一区二区精品忘忧草| 国产伦一区二区三区色一情| 国产日韩欧美亚洲一区| 狠狠综合久久av一区二区小说| 国内精品伊人久久久久av影院| 一色屋精品亚洲香蕉网站| 亚洲丁香婷深爱综合| 日韩午夜电影| 亚洲欧美激情精品一区二区| 欧美一级片久久久久久久| 久久久免费观看视频| 裸体丰满少妇做受久久99精品| 免费在线看成人av| 亚洲黄色免费| 一本色道久久综合一区 | 久久久久9999亚洲精品| 久久亚洲视频| 亚洲精品一二区| 亚洲少妇诱惑| 久久久精品一区| 欧美精品在线观看播放| 国产精品白丝av嫩草影院| 国产精品一区二区黑丝| 亚洲成色www久久网站| 一区二区三区视频在线| 欧美一区二区三区四区高清| 美女视频黄免费的久久| 亚洲精品久久久久久久久久久久久 | 国产精品高潮呻吟视频| 国内精品伊人久久久久av影院 | 一区二区三区精品久久久| 午夜精品一区二区三区在线视 | 亚洲欧美韩国| 久久综合福利| 9国产精品视频| 久久嫩草精品久久久精品一| 欧美日韩一区在线视频| 国产综合婷婷| 亚洲影院免费观看| 欧美成人日韩| 亚洲欧美一区二区激情| 欧美精品成人| 国内揄拍国内精品少妇国语| 亚洲天堂黄色| 欧美大片18| 午夜视频在线观看一区二区三区| 欧美顶级艳妇交换群宴| 国产欧美丝祙| 亚洲午夜视频在线| 亚洲国产电影| 久久精品99| 国产精品视频免费一区| 日韩香蕉视频| 欧美顶级艳妇交换群宴| 午夜精品免费在线| 欧美日韩视频一区二区| 在线日韩成人| 久久久噜噜噜久久| 亚洲午夜激情网站| 欧美激情亚洲一区| 亚洲福利视频一区| 久久久无码精品亚洲日韩按摩| 在线一区观看| 欧美精品观看| 亚洲区第一页| 欧美va天堂| 久久高清一区| 国产无遮挡一区二区三区毛片日本| 一本色道久久99精品综合 | 欧美日韩在线电影| 亚洲国产第一| 久久综合九色综合欧美狠狠| 亚洲欧美国产va在线影院| 欧美日韩亚洲免费| 日韩亚洲精品电影| 最新中文字幕亚洲| 欧美成人激情视频免费观看| 亚洲高清视频一区| 免费不卡在线观看| 久久久久在线| 在线免费观看日韩欧美| 久久香蕉精品| 久久精品夜色噜噜亚洲aⅴ| 国产在线日韩| 久久久久久网站| 久久精品国产v日韩v亚洲| 国产日韩一区二区三区| 久久九九有精品国产23| 篠田优中文在线播放第一区| 国产亚洲va综合人人澡精品| 久久精品系列| 久久国产精品99久久久久久老狼| 国产一二精品视频| 久久综合狠狠综合久久综青草| 久久国产日本精品| 激情综合中文娱乐网| 欧美成人国产| 欧美精品激情| 亚洲一级一区| 亚洲欧美日韩一区| 国产一区二区三区不卡在线观看| 久久色在线观看| 久久午夜精品一区二区| 亚洲激情在线播放| 最新精品在线| 国产精品乱人伦一区二区 | 国产一区二区丝袜高跟鞋图片| 久久久噜噜噜久久人人看| 久久米奇亚洲| 亚洲精品久久久久久久久久久久久 | 欧美成人精品一区二区| 一区二区三区 在线观看视| 亚洲网站在线观看| 国产一区久久| 欧美激情在线狂野欧美精品| 欧美日本高清| 欧美一区二区视频在线| 久久国产福利| 亚洲久久视频| 亚洲专区欧美专区| 亚洲国产欧美不卡在线观看| 亚洲乱码视频| 国产一区二区中文字幕免费看| 欧美高清在线观看| 国产精品久久毛片a| 巨乳诱惑日韩免费av| 欧美日韩精品免费观看视频| 欧美影院在线播放| 欧美成人精品1314www| 性做久久久久久久久| 美女福利精品视频| 亚洲欧美久久久| 浪潮色综合久久天堂| 亚洲女性喷水在线观看一区| 久久久久一区| 亚洲男人天堂2024| 美女啪啪无遮挡免费久久网站| 亚洲欧美日韩精品| 欧美成黄导航| 久久精品在这里| 欧美日韩在线精品一区二区三区| 久久久久88色偷偷免费| 欧美日韩午夜激情| 欧美xx69| 国产热re99久久6国产精品| 亚洲人成欧美中文字幕| 国产一区二区按摩在线观看| 亚洲精品视频在线| 精品不卡视频| 亚洲一区视频在线| 亚洲免费黄色| 久久这里只有| 久久国产免费看| 欧美午夜精品久久久久免费视| 欧美成人情趣视频| 国内精品嫩模av私拍在线观看| 一区二区久久久久| 99精品欧美一区| 裸体一区二区三区| 久久综合伊人77777麻豆| 国产精品婷婷|