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