初探Stage3D(一) 3D渲染基础原理
關(guān)于本文
本文主要想介紹一下3D渲染的基本流程,及怎樣把一個三角形(0,1,0),(1,0,1),(0,0,1)最終渲染到屏幕上來。文章的目的是對3D渲染流程做一個簡單的介紹,其中不涉及任何語言的API
參考資料
- 《3D游戲編程大師技巧》 PFD地址?http://download.csdn.net/detail/iamzealotwang/652886?(中文)?
是我很早之前分享的一本書.非常不錯,最早是在學(xué)校圖書館里面看到的,市面上一度絕版,后來找了一家淘寶店復(fù)印了一本才留了下來。?
剛剛查了一下,現(xiàn)在已經(jīng)又有賣的的,如果對3D感興趣建議一定要留一套 - 《3D數(shù)學(xué)基礎(chǔ):圖形與游戲開發(fā)》 PDF地址?http://download.csdn.net/detail/iamzealotwang/4886344
- How Stage3D works?http://www.adobe.com/devnet/flashplayer/articles/how-stage3d-works.html(英文)
?
局部坐標(biāo)和世界坐標(biāo)
接觸Flash的人應(yīng)該不太難理解這個概念吧,比如在庫中建立一個邊長為50的正方形,設(shè)置其左上角為原點,局部坐標(biāo)的(0,0)為原點
然后將其拖入Flash的主舞臺上面以后,就會得到一個全局坐標(biāo)(84,110)
那剛才拖動的一下操作,完成的是怎樣的一個運算呢?
拋開填充的藍(lán)色先不談,那么幾何上面來說,正方形是由4個點構(gòu)成的,A(0,0) B(0,50) C(50,0) D(50,50)
剛才做的操作可以理解把該正方形拖放到舞臺的(84,100)位置。對應(yīng)的得到ABCD四點坐標(biāo)分別為A’(0+81,0+100) B’(0+84,0+50) C’(50+84,0+100) D’(50+84,50+100)
這樣也就是完成了一次局部坐標(biāo)到世界坐標(biāo)的轉(zhuǎn)換
那同樣的道理,對于一個3D坐標(biāo)點A(0,0,0) 也可以執(zhí)行一次坐標(biāo)變換,比如(84,100,37),這樣也能得到一個對應(yīng)的3D坐標(biāo)點A’(0+81,0+100,0+37)
?
為何要進行局部坐標(biāo)到世界坐標(biāo)轉(zhuǎn)換
在平常我們做Flash時候也一樣,比如要做一個小人站在房子邊上的圖,那肯定是單獨建立兩個元件 元件::小人 元件::房子 ,然后將其拖入主舞臺拼湊在一起。3D中也是一樣的各種物體也是現(xiàn)在自己的坐標(biāo)系內(nèi)制作好,
最后放入場景內(nèi)進行的拼接
?
了解矩陣
在進一步介紹3D之前,首先需要了解一下矩陣。本來想給出一些自己的例子,不過參考了一下現(xiàn)有資料,發(fā)現(xiàn)沒有太多好補充的東西。如果對矩陣的基本改變還不是很了解
(比如矩陣是做什么用的,矩陣相乘,旋轉(zhuǎn)矩陣,平移矩陣等)
請參考如下部分
《3D游戲編程大師技巧》 P161~P165
《3D數(shù)學(xué)基礎(chǔ):圖形與游戲開發(fā)》 P85~P107
?
攝像機&視景體
在把所有物體完成了從局部坐標(biāo)系到全局坐標(biāo)系的轉(zhuǎn)化,及完成了構(gòu)建一個3D場景,只是這個場景中全部是由點構(gòu)成的。這個時候就需要引入攝像機的概念,攝像機就像一雙在這3D世界中的眼睛,眼睛的位置不同,
看的方向不同,那最終看到的景象也就不同.
和現(xiàn)實世界中的攝像機稍微有些不同,在于需要給這個攝像空間定義一個區(qū)域,及近剪裁面和遠(yuǎn)剪裁面。也就是小于近剪裁面和大于遠(yuǎn)剪裁面的物體將不會被渲染
在遠(yuǎn)剪裁面之外的物體:?可以理解為即使渲染了該物體也會是一個點,所以不進行渲染。在玩兒一些早期的3D游戲時候有時候會出現(xiàn)這種情況,一直向前走,前方的建筑物會突然從遠(yuǎn)處出現(xiàn),我想也是這種原因吧
在近剪裁面之外的物體:?如果渲染的話會是一個非常大的物體,所以也不進行渲染。(近剪裁面如果用現(xiàn)實中的相機做比喻似乎不是很容易理解,當(dāng)時若吧這個放入數(shù)學(xué)定義中去理解,反而容易一些)
?
世界坐標(biāo)到相機坐標(biāo)的轉(zhuǎn)換
當(dāng)確定好視景體后,也就可以確定了哪些物體最終可以見,哪些是不可以見。剔除這些不可見的物體后,需要將其余物體進行世界坐標(biāo)到相機坐標(biāo)的轉(zhuǎn)換。
在一種極端情況下是不需要進行該步驟的,就是相機在原點(0,0,0)且方向和坐標(biāo)軸的方向是一致的,此時不需要再進行轉(zhuǎn)換
但是大部分時候,相機其實是不在原點的,且所朝的方向也不是坐標(biāo)軸方向。
此時就要對這些物體(物體的每個頂點)進行世界坐標(biāo)到相機坐標(biāo)的變換。
變換一共分為幾個步驟,
第一步 平移
如圖,也就是假設(shè)相機的坐標(biāo)點為(cam_x,cam_y,cam_z),那對所有剩余物體的頂點均執(zhí)行平移操作(world_x-cam_x,world_y-cam_y,world_z-cam_z)
第二步 旋轉(zhuǎn)
此時相機已經(jīng)處于坐標(biāo)原點處了,不過相機鏡頭仍舊是歪的,仍舊需要對其進行x,y,z三方向旋轉(zhuǎn)才可以將相機還原為最開始那張圖所畫的樣子。
對于先旋轉(zhuǎn)哪個,后旋轉(zhuǎn)哪個是無所謂的。及按xyz還是zyx方向旋轉(zhuǎn)都是一樣
最終流程:
?
為何要進行相機坐標(biāo)轉(zhuǎn)換
如果還不是很理解為何要進行相機坐標(biāo)轉(zhuǎn)換,可以再回到2D世界,還是最早的例子,那個正方形A(0,0) B(0,50) C(50,0) D(50,50)?經(jīng)過的局部到世界坐標(biāo)的轉(zhuǎn)換是A'(0+81,0+100)? B'(0+84,0+50)? C'(50+84,0+100) D'(50+84,50+100)
A'點也就是為(0+81,0+100)->(81,100)
此時如果假設(shè)你自己就是相機,眼睛和舞臺的0,0點對齊,眼部和顯示器距離為300,那么A'點在你眼中的三維坐標(biāo)也就是(81,100,300)
此時也就是之前所說的極端情況,攝像機和全局坐標(biāo)同軸且共相。那A'點(81,100,300) 也就是最終渲染到屏幕上面的坐標(biāo)點,但是
如果此時你離開顯示器一段距離,且歪一下腦袋,再看A'點(81,100,300),這時候其所在你自己眼睛(攝像機)中的位置就不是原來那個位置了,
假設(shè)此時你看到的景象是M,
那你可以想象此時你回到原位,然后有另外一個人,抱起你的顯示器放在另外一個位置且稍微轉(zhuǎn)一個角度
此時你看到的景象仍舊是M,
那個人對那個物體進行的操作(抱起來放邊上且轉(zhuǎn)了一個角度)就是相機坐標(biāo)變換
?
物體剔除&背面消除
這塊知識我想簡單的說一下,在《3D游戲編程大師技巧》 里面有非常詳細(xì)的說明
物體剔除:
物體剔除在2D中也是存在的,對一個物體進行包圍盒測試,如果不再場景內(nèi)則不顯示該物體,3D中也是做同樣的操作,只不過包圍盒是三維的,且探測范圍也不再是一個平面,而是整個視景體。
背面消除:
當(dāng)一個物體確實是在視景體內(nèi)部時候,也不是所有面均需要最終渲染出來,此時要做的就是背面剔除,將那些被完全擋住的平面剔除出去
?
為何要進行剔除
在渲染流程的前段步驟,所有操作均是針對點的,比如坐標(biāo)轉(zhuǎn)換,剔除等.當(dāng)最終確定了一個面確實要被渲染以后。后半段的操作及要對該面進行著色(設(shè)置紋理),光照處理等。
所以如果可以在前期多剔除掉一個面,就應(yīng)該多剔除一個。
?
透視變換
當(dāng)完成了一切剔除操作后,對于剩下的平面(此時剩余的僅為一個個平面了),還需要進行透視變換。也就是將一個三維點A'(81,100,300) 變換為一個二維的坐標(biāo)點。
這里面的轉(zhuǎn)換涉及兩種
正交投影
來源?http://baike.baidu.com/view/3153027.htm
這種投影比較簡單,及直接去除z點的值即可,一般用在工業(yè)制圖上面(AutoCAD),對于Starling(Flash上面使用Stage3D技術(shù)加速2D游戲的引擎),目前我還不是很了解。不過為自己寫的一個Demo,投影選擇的就是
正交投影。因為原本需要渲染的就是一個2D平面,只要其在視景體內(nèi),其大小就和所在位置無關(guān)了
透視投影
來源?http://baike.baidu.com/view/1318206.htm
透視投影及實現(xiàn)了近大遠(yuǎn)小的投影,及離攝像機距離較遠(yuǎn)的物體看起來會相對小一些,離攝像機進的物體看起來更大一些。和真實世界中看到的是一樣的。在三維游戲中用到的均為這種投影
?
兩者的區(qū)別下面這張圖很好的標(biāo)示出來
左面的為透視投影,右面的為正交投影
?
整體流程概覽
3D渲染流程上面大體就是這樣了
圖中在背面消除后采取了兩種方式,
B路線為畫家算法(http://baike.baidu.com/view/2020287.htm),
A路線為在常規(guī)的物體消除后再進行一次空間剪裁(及把那些不是完全在視景體內(nèi)部的元件再剪裁,及AABB測試壓線的物體)
但是無論是經(jīng)過A路線,還是B路線 最終剩余的平面就會開始光柵化(忽略屏幕坐標(biāo)變化,具體的請看書)。及真正的對其進行著色,打光等操作了
?
本文和Stage3D的關(guān)系
首先請閱讀兩篇文章
GPU大百科全書第二章 凝固生命的光柵化?http://vga.zol.com.cn/236/2366808.html
How Stage3D works?http://www.adobe.com/devnet/flashplayer/articles/how-stage3d-works.html
看完這兩篇文章以后可以看出,本文其實只是大體上面說明了一下3D渲染的基本過程,但是和目前真正的技術(shù)(我參考的資料已經(jīng)是十幾年前的東西了吧)還是有一定出入的,
Stage3D最相關(guān)的東西也就是這張圖中的
VertexShader?還有?FragmentShader(也就是Pixel shaders)
我在初探Stage3D(二) 了解AGAL中做了一些說明,
VertexShader?主要作用就是3D流程中的前半段操作(對頂點進行一系列的矩陣變換)
FragmentShader?操作是對這些變換后的頂點(及流程中的光柵化部分)進行渲染
?
轉(zhuǎn)載于:https://www.cnblogs.com/zhepama/p/4362388.html
總結(jié)
以上是生活随笔為你收集整理的初探Stage3D(一) 3D渲染基础原理的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 阿里巴巴常考面试题及汇总答案
- 下一篇: [转] android获取手机信息大全