前言
現(xiàn)實(shí)中,光照射到物體上熬尺,物體反射光進(jìn)入人眼摸屠,形成顏色,組合成視覺(jué)效果粱哼,相機(jī)模擬這一過(guò)程季二,圖形亦然。圖形渲染根據(jù)3d場(chǎng)景生成2d圖像,圖像盡可能模擬自然胯舷,盡可能真實(shí)刻蚯。
渲染有兩種方式,射線追蹤和光柵化桑嘶,前者更接近自然規(guī)則炊汹,實(shí)現(xiàn)簡(jiǎn)單效果好,不過(guò)計(jì)算量大逃顶,廣泛應(yīng)用電影CG等離線渲染讨便,后者效率高,實(shí)現(xiàn)自然效果比較麻煩以政,同時(shí)GPU硬件支持霸褒,廣泛應(yīng)用游戲等實(shí)時(shí)渲染。
簡(jiǎn)介
計(jì)算機(jī)圖形盈蛮,通過(guò)計(jì)算機(jī)模擬3d世界废菱,并最終通過(guò)2d屏幕展示。主要包括Modeling/Rendering/Animation抖誉。
Modeling殊轴,通過(guò)數(shù)學(xué)方式建立3d幾何數(shù)據(jù)√宦可以通過(guò)3dMax梳凛、Blender等建模軟件,也可以通過(guò)數(shù)學(xué)公式表達(dá)梳杏。
Rendering,接受3d幾何數(shù)據(jù)淹接,最終顯示在2d屏幕上十性,常見(jiàn)有光柵化和射線追蹤。
Animation塑悼,間隔一定時(shí)間變換屏幕顯示劲适,造成動(dòng)畫(huà)錯(cuò)覺(jué)。
這里主要是介紹Rendering即渲染厢蒜,模型和動(dòng)畫(huà)會(huì)在后續(xù)3ds Max詳解霞势。
數(shù)學(xué)
數(shù)學(xué)是一切自然科學(xué)的基石,圖形學(xué)大量使用數(shù)學(xué)知識(shí)斑鸦。
坐標(biāo)系
為了描述位置愕贡、方向等信息,需要選擇一個(gè)度量的參考點(diǎn)巷屿,這個(gè)就是坐標(biāo)系固以,常見(jiàn)的有笛卡爾坐標(biāo)系,用互相垂直的軸作為原點(diǎn)參考。2d的有x和y軸憨琳,3d的有xyz三個(gè)互相垂直的軸诫钓,常見(jiàn)的有左手坐標(biāo)系和右手坐標(biāo)系,dx采用左手坐標(biāo)系篙螟,opengl采用右手坐標(biāo)系菌湃。計(jì)算機(jī)的顯示屏幕,本質(zhì)上是一個(gè)橫豎布局的畫(huà)布遍略,左上角為原點(diǎn)惧所,向下為正,y軸依次增加墅冷,向左為正纯路,x軸依次增加。手機(jī)屏幕1920 x 1080寞忿,橫向x軸1920個(gè)像素驰唬,y軸1080個(gè)像素,最終手機(jī)渲染的圖像會(huì)顯示在這個(gè)像素區(qū)域腔彰。
向量和矩陣
向量用來(lái)表達(dá)幾何數(shù)據(jù)叫编,矩陣用來(lái)變換向量。向量用來(lái)表達(dá)3d空間的位置霹抛、方向搓逾、法線等等幾何數(shù)據(jù),向量常見(jiàn)的運(yùn)算有杯拐,求長(zhǎng)霞篡、歸一、相乘端逼、點(diǎn)積和叉積等等朗兵,有良好的數(shù)學(xué)和幾何屬性,用來(lái)表達(dá)基礎(chǔ)幾何數(shù)據(jù)顶滩。矩陣的初衷用來(lái)解決數(shù)學(xué)函數(shù)的求解余掖,有良好的數(shù)學(xué)表達(dá)能力,被發(fā)覺(jué)用來(lái)做變量變換礁鲁。矩陣常見(jiàn)的運(yùn)算有盐欺、相乘、轉(zhuǎn)置仅醇、求反等等冗美。向量常見(jiàn)的三種變化移動(dòng)、縮放和旋轉(zhuǎn)析二,3d向量坐標(biāo)系轉(zhuǎn)換墩衙、轉(zhuǎn)換成2d并最終轉(zhuǎn)換成屏幕空間的2d像素等等,用矩陣都可以很好很高效的實(shí)現(xiàn)。
幾何
使用數(shù)據(jù)來(lái)表達(dá)3d世界漆改,可以使用網(wǎng)格(Mesh)心铃,也可以使用數(shù)學(xué)公式,前者是渲染和很多操作的基石挫剑,后者也用于很多地方的計(jì)算去扣。一個(gè)圓形,既可以用mesh樊破,很多三角形來(lái)模擬愉棱,也可以使用數(shù)學(xué)公式,(x-x0) * (x - x0) + (y - y0) * (y - y0) = r * r來(lái)表達(dá)哲戚。比如在引擎中導(dǎo)入模型奔滑,基礎(chǔ)的mesh數(shù)據(jù)外面往往帶有包圍盒或者包圍球,渲染的時(shí)候顺少,首先判定包圍盒或球是否在視錐體朋其,如果在進(jìn)行后續(xù)流程,不在的話脆炎,直接剔除梅猿,這個(gè)叫做攝像機(jī)剔除,大大提高場(chǎng)景渲染效率秒裕。射線相交的時(shí)候袱蚓,首先判定射線是否和包圍盒或者包圍球相交,如果相交几蜻,進(jìn)行后續(xù)步驟喇潘,大大提高相交效率。
兩者都有大量運(yùn)用梭稚,這里主要是講Mesh颖低。網(wǎng)格主要包括點(diǎn)(Vector),線(Egde)和面(Face)哨毁。面有很多拓?fù)鋯卧褂帽容^多的三角形源武,三角關(guān)系比較穩(wěn)定扼褪,三角組成了最簡(jiǎn)單的面,沒(méi)有歧義粱栖,適用于大量數(shù)學(xué)運(yùn)算并且被GPU支持话浇,效率非常高。
渲染
根據(jù)3d場(chǎng)景生成2d圖像闹究,并在屏幕上顯示幔崖,圖像可以是真實(shí)感的,也可以是非真實(shí)感的,前者需要模擬大自然的模擬現(xiàn)象赏寇。
渲染流程的話吉嫩,大概如下3d場(chǎng)景->渲染過(guò)程->顯示屏幕
1,顯示屏幕嗅定,本質(zhì)橫向和縱向的像素畫(huà)布自娩,連續(xù)的量轉(zhuǎn)換成離散的量會(huì)出現(xiàn)鋸齒,減少鋸齒的話渠退,有三個(gè)方面忙迁,加大屏幕分辨率,抗鋸齒算法和動(dòng)畫(huà)
2碎乃,3d場(chǎng)景姊扔,主要包括Model,Camera和Light梅誓,Model的話恰梢,可以使用網(wǎng)格來(lái)表示,也可以數(shù)學(xué)方式來(lái)表達(dá)证九。
3删豺,渲染過(guò)程,渲染主要包括兩個(gè)階段愧怜,透視和著色呀页。
人眼看自然世界,遠(yuǎn)處看起來(lái)更小拥坛,秋水共長(zhǎng)天一色蓬蝶,遠(yuǎn)處的山和水竟然連在一起啦!這個(gè)是透視現(xiàn)象猜惋,照相機(jī)和圖形渲染時(shí)候丸氛,都采用相同原理。人眼看到各種顏色主要是有光著摔,光通過(guò)各種反射折射等等最終傳播到人眼形成顏色缓窜,這個(gè)過(guò)程稱為著色。
渲染過(guò)程
3.1 透視
透視將3d場(chǎng)景轉(zhuǎn)換成2d像素谍咆。
光柵化的話禾锤,通過(guò)矩陣投影將3d轉(zhuǎn)換成2d(透視除法)和深度信息(z-buffer),根據(jù)深度判定前后關(guān)系摹察,離攝像機(jī)進(jìn)的覆蓋遠(yuǎn)處恩掷。射線追蹤通過(guò)從攝像機(jī)射出射線,判定是否相交供嚎,距離近的覆蓋遠(yuǎn)的黄娘。光柵化效率更高峭状,目前被GPU支持。
3.2 著色
著色生成像素的顏色逼争。著色計(jì)算所有的光照信息在材質(zhì)表面的行為优床,并最終生成反射形成顏色。
光由大量光子構(gòu)成氮凝,光子傳播到材質(zhì)上羔巢,會(huì)根據(jù)表面的垂直方向(法線)和入射方向形成反射,反射最終到達(dá)人眼形成顏色罩阵,材質(zhì)的感覺(jué)比如鏡面竿秆、塑料、金屬也跟材質(zhì)的各種屬性決定稿壁。漫反射幽钢,材質(zhì)表面比較粗糙,光朝這個(gè)各個(gè)方向反射傅是,效果取決與光的方向和表面法線匪燕,用于模擬塑料等材質(zhì)。鏡面(光澤)反射喧笔,光的反射主要集中在特定方向帽驯,效果取決與光的方向、表面法線和觀察方向书闸,用于模擬鏡子尼变、金屬等材質(zhì)。
透明浆劲,光傳播到類似于玻璃球這樣的透明材質(zhì)嫌术,會(huì)有反射和折射現(xiàn)象,反射和折射滿足菲涅耳公式牌借。用于模擬度气,玻璃球、水等透明的材質(zhì)膨报。
次表面反射磷籍,實(shí)現(xiàn)半透明效果,用于模擬皮膚等现柠。
間接光照院领,光的效果不是來(lái)自光源,而是其他材質(zhì)的反射晒旅。
全局光照栅盲,關(guān)照即來(lái)自光源汪诉,也來(lái)自其他材質(zhì)的反射等废恋,用于模擬更真實(shí)
射線追蹤
該算法能夠比較好的模擬自然現(xiàn)象谈秫,不過(guò)計(jì)算量大,廣泛應(yīng)用離線渲染鱼鼓。
射線追蹤的路徑
1拟烫,F(xiàn)arward Tracing(light tracing),模擬自然界光子的運(yùn)動(dòng)迄本,不過(guò)硕淑,光子的運(yùn)動(dòng)隨機(jī),光子與表達(dá)介質(zhì)的幾何數(shù)據(jù)求交消耗大嘉赎,現(xiàn)實(shí)中置媳,光源包括大量大量的光子,實(shí)現(xiàn)這種機(jī)制公条,計(jì)算消耗大拇囊,效果隨機(jī),大量采樣才能保證效果靶橱。
2寥袭,Backward Tracing(eye tracing),從攝像機(jī)射出射線(primary ray)关霸,判定當(dāng)前攝像是否和模型相交传黄,根據(jù)模型的材質(zhì),反射生成新的射線(shadow ray)队寇,這樣射線和運(yùn)算都可以控制下來(lái)膘掰。主要的話采用這種方式實(shí)現(xiàn)。
算法步驟:
1英上,生成射線炭序。屏幕相當(dāng)于攝像機(jī)前面的畫(huà)布,從攝像機(jī)位置出發(fā)苍日,對(duì)屏幕上每個(gè)像素生成射線惭聂,carema ray(primary ray)
2,射線幾何相交相恃。判定射線和幾何體相交辜纲,著色距離最近的片段,傳遞給下一階段拦耐,沒(méi)有任何相交片段的話耕腾,重復(fù)步驟1.
3, 著色片段,根據(jù)介質(zhì)屬性和光的傳播特性杀糯,生成shadow ray扫俺,最終著色,形成像素固翰,傳遞下一階段狼纬。
4羹呵,顯示階段,更新FrameBuffer疗琉,給屏幕顯示冈欢。
光柵化
實(shí)時(shí)渲染的主流技術(shù),理論形成較早盈简,有成熟的pipeline支持凑耻,性能較好,實(shí)現(xiàn)各種復(fù)雜效果比較麻煩柠贤,廣泛應(yīng)用于游戲等領(lǐng)域香浩,被GPU硬件支持。
算法步驟:
1臼勉,投影階段弃衍,3d點(diǎn)轉(zhuǎn)換成2d點(diǎn)。轉(zhuǎn)換過(guò)程為局部坐標(biāo)系->世界坐標(biāo)系->攝像機(jī)坐標(biāo)系->NDC->屏幕坐標(biāo)系坚俗,輸出2d點(diǎn)镜盯,給下階段使用。
2猖败,光柵階段速缆,2d點(diǎn)組成2d面,2d面填充片段恩闻,這個(gè)過(guò)程中艺糜,連續(xù)的量通過(guò)離散的量表示,會(huì)出現(xiàn)鋸齒幢尚。插值單個(gè)片段破停,獲得單個(gè)片段的屬性。輸出片段尉剩,給下階段使用真慢。這個(gè)過(guò)程,需要透視矯正理茎。
3黑界,著色階段,著色單個(gè)片段皂林。根據(jù)片段的材質(zhì)屬性比如光照朗鸠、紋理等形成最終顏色,輸出像素础倍,給下階段使用烛占。
4,顯示階段沟启,投影階段會(huì)存儲(chǔ)相應(yīng)的深度值忆家,離攝像機(jī)進(jìn)的片段輸出像素至FrameBuffer呀癣,最終給屏幕顯示。