改變視點

1.

深度渲染緩存(Depth Render Buffer)

三角形、線段和點是按它們被GPU處理的順序被渲染的。如果沒有一個深度緩存,為最后一個對象的繪制而產(chǎn)生的片元總是會覆蓋以前渲染的層疊的片元。

視點決定了場景中的哪一個對象會被渲染在其他對象前面。

變換(transformation)使從任意視點渲染場景成為可能。

一個變化的視點必然需要重新計算所繪制對象的正確順序。

深度渲染緩存是一個可選的輸出緩存,與像素顏色渲染緩存相似。

幾乎所有的OpenGLES應(yīng)用都使用深度緩存,因為幾乎所有的OpenGLES應(yīng)用都使用深度緩存,因為幾乎所有的應(yīng)用都使用坐標(biāo)系轉(zhuǎn)換來改變渲染的視點。

在大部分情況下,一個深度緩存會消除對于三角形、線段和點進行排序的需求。

深度緩存也常常叫做Z緩存,因為如果坐標(biāo)系的X軸和Y軸對應(yīng)于屏幕的寬和高,那么Z軸只是的就是屏幕的內(nèi)外。一個片元和視點之間的距離大體相當(dāng)于這個片元沿著Z軸深入屏幕的位置。

GPU把對于每個片元的深度的計算作為渲染的一個固定部分。深度緩存的使用為GPU提供了一個用來保存計算出深度的地方,之后這個深度又被GPU利用來控制在像素顏色渲染緩存中的片元的位置的置換。

2.

利用GLKit添加深度緩存

GLKit支持使用16位或24位來保存深度值的深度渲染緩存。



以上代碼使用了一個變換來矯正拉伸的渲染效果。

GLKMatrix4GLKMatrix4MakeScale(float sx,float sy,float sz)函數(shù),上面代碼中表示會沿著X軸,Z軸保持不變,沿著Y軸的單位長度aspectRatio為(GLfloat)view.drawableWidth/(GLfloat)view.drawableHeight的值,drawableWidth屬性以像素為單位提供了視圖的像素顏色渲染緩存的寬度,與視圖全屏Core Animation相適配。drawableHeight屬性以像素為單位提供了高度。屏幕縱橫比為寬度除以高度。

3.

深入探討不用GLKit添加深度緩存

管理一個深度緩存需要的步驟:

(1)Generate (生成) ——— 告訴OpenGLES為深度緩存生成一個獨一無二的標(biāo)識符。

(2)Bind (綁定) ——— 告訴OpenGLES在接下來的操作中使用哪一個緩存。

(3)Configure Storage(配置存儲) ——— 指定深度緩存的大小

(4)Attach (附加)——— 附加深度緩存到一個幀緩存。

與一個Core Animation層分享內(nèi)存的像素顏色渲染緩存在層調(diào)整大小時會自動調(diào)整大小。其他的緩存,例如深度緩存,并不會自動調(diào)整大小。每當(dāng)一個AGLKView實例被重新調(diào)整大小時,與他相關(guān)聯(lián)的層也會調(diào)整大小并且視圖的-(void)layoutSubviews方法會被調(diào)用。

4.

變換

從數(shù)學(xué)上說,變換就是在兩個坐標(biāo)系之間轉(zhuǎn)換頂點坐標(biāo)。

每個坐標(biāo)系都是相對于其他的參照坐標(biāo)系的。

對于OpenGLES來說,最終的參照坐標(biāo)系實在一個像素顏色渲染緩存中的像素位置的2D數(shù)組。

在渲染過程中,GPU會轉(zhuǎn)換點、線和三角形的頂點坐標(biāo)為著色片元。當(dāng)前(實際上是在GPU處理頂點數(shù)據(jù)時)坐標(biāo)系決定了片元在像素顏色渲染緩存和深度緩存中的位置。

線性代數(shù)可以為坐標(biāo)系間轉(zhuǎn)換提供解決方案。任意數(shù)量任意順序的基本變換都可以能夠被捕獲并保存在一個簡單的4*4的浮點值矩陣中。一個矩陣定義一個坐標(biāo)系。

矩陣計算幾乎完全使用加法和乘法,并且在現(xiàn)代GPU上執(zhí)行的非???。這是好事,因為每次一個場景被渲染時,GPU就會變換所有的頂點,并且在一個場景中常常含有幾十萬個頂點。

5.

基本變換

平移translation、旋轉(zhuǎn)rotation、縮放scale、透視perspective

以上四個基本變換聯(lián)合決定了在一個新坐標(biāo)系中的每一個頂點位置是怎么轉(zhuǎn)換為參考坐標(biāo)系中的一個位置的。

每個基本變換對應(yīng)于矩陣的一個簡單變化。

(1)平移:

通過相對于參考坐標(biāo)系的原點移動新坐標(biāo)系的原點,定義了一個新的坐標(biāo)系。平移不會影響坐標(biāo)軸的單位長度,平移不會改變坐標(biāo)軸相對于參考坐標(biāo)系的方向。

GLKMatrix4GLKMatrix4MakeTranslation(float tx,float ty,float tz)


函數(shù)通過平移一個單位矩陣來返回一個定義了坐標(biāo)系的新矩陣。x、y、z參數(shù)指定了新坐標(biāo)系的原點沿著當(dāng)前參考坐標(biāo)系的每個軸移動的單位數(shù)。

(2)旋轉(zhuǎn):

通過相對于參考坐標(biāo)系坐標(biāo)軸的方向旋轉(zhuǎn)新坐標(biāo)系的坐標(biāo)軸來定義一個新的坐標(biāo)系。旋轉(zhuǎn)的坐標(biāo)系會與參考坐標(biāo)系使用同一個原點。旋轉(zhuǎn)不會影響坐標(biāo)軸的單位長度,只有坐標(biāo)軸的方向會發(fā)生變化。

GLKMatrix4GLKMatrix4MakeRotation(float radians,float x,float y,float z);


函數(shù)通過旋轉(zhuǎn)一個單位矩陣來返回定義了一個坐標(biāo)系的新矩陣。radians參數(shù)指定了要旋轉(zhuǎn)的弧度數(shù)。

(3)縮放:

通過相對于參考坐標(biāo)系的坐標(biāo)系的單位長度改變新坐標(biāo)系的坐標(biāo)軸的單位長度來定義一個新的坐標(biāo)系。縮放的坐標(biāo)系與參考坐標(biāo)系使用同一個原點,坐標(biāo)軸的防線通常不會改變。不過,通過一個負值所做的縮放會反轉(zhuǎn)坐標(biāo)軸的方向。

GLKMatrix4GLKMatrix4MakeScale(floatsx,floatsy,floatsz)


函數(shù)會通過擴大或縮小一個單位矩陣的任意坐標(biāo)軸的單位長度來返回一個定義了坐標(biāo)系的矩陣。x、y、z參數(shù)指定了用來擴大或縮小每個軸的單位長度的因數(shù)。

(4)透視:

透視是通過相對于參考坐標(biāo)軸的單位長度多樣化新坐標(biāo)系的坐標(biāo)軸的單位長度來定義一個新的坐標(biāo)系。透視不會改變坐標(biāo)軸的方向或者原點,但是坐標(biāo)軸的每個單位離原點越遠長度越短。這個效果會讓在遠處的物體比離原點近的物體顯得更小。

GLKMatrix4GLKMatrix4MakeFrustum(float left,float right,float bottom,float top,float nearZ,float farZ);


函數(shù)會透視一個單位矩陣來返回一個定義了坐標(biāo)系的新矩陣。透視坐標(biāo)系的的形狀是一個類似角椎體的平截頭體。


以上為5-4例子中處理基本變幻的代碼。

結(jié)合四大變幻,可以定義新的坐標(biāo)系,不過重要的是變換的順序。平移在旋轉(zhuǎn)的前面還是后面會產(chǎn)生不同的坐標(biāo)系??s放在旋轉(zhuǎn)的前面還是后面也會產(chǎn)生不同的坐標(biāo)系。先旋轉(zhuǎn)再平移最后縮放與先平移再旋轉(zhuǎn)最后縮放是不同的。

5.1

projectionMatrix 和 modelviewMatrix

GLKBaseEffect的transform屬性是一個GLKEffectPropertyTransform類型的實例并為支持常見的操作保存了三個不同的矩陣。

projectionMatrix用于整個場景的坐標(biāo)系。

modelviewMatrix用于控制對象(場景內(nèi)模型)顯示位置的坐標(biāo)系。

GLKBaseEffect會級聯(lián)modelviewMatrix和projectionMatrix以產(chǎn)生一個modelviewProjectionMatrix矩陣,這個矩陣會把對象頂點完全地變換到OpenGLES默認坐標(biāo)系中。

默認坐標(biāo)系直接映射到像素顏色緩存中的片元位置。

5-4例子中在viewDidLoad方法中初始化modelviewMatrix,使用一個明顯的右上視角來渲染對象。


5-4中移動滑塊時,會更新每個用戶用來控制變換的值。首先保存baseEffect的modelviewMatrix的當(dāng)前值,以便加載。然后通過按特定的順序連接當(dāng)前矩陣與用戶控制的三個變換矩陣,這個例子構(gòu)建了一個新的矩陣。

在用戶控制的變換結(jié)合到modelviewMatrix后,為繪制準(zhǔn)備好baseEffect,最后用一個白色的漫反射光繪制場景中的對象。

重新設(shè)置modelviewMatrix為保存的值,燈光顏色改為黃色,再次繪制相同的對象。場景中的黃色對象提供了一個參考,以便可以清楚地觀察用戶控制的變換會怎么影響在最終的像素顏色渲染緩存中的白色對象的哪些片元。

總結(jié):除了使用以上通過臨時變量保存并回復(fù)modelviewMatrix外。GLKit還提供了一個方便的數(shù)據(jù)類型GLKMatrixStack,還提供了一個用來向堆棧數(shù)據(jù)結(jié)構(gòu)保存矩陣的函數(shù)集合。堆棧是一個后進先出的數(shù)據(jù)結(jié)構(gòu),它可以方便地存儲某個程序可能需要回復(fù)的矩陣。

5.2

textureMatrix


以上5-5中代碼顯示了

5-5例子實現(xiàn)了紋理矩陣textureMatrix.

6.

復(fù)合變換手冊

傾斜

是一個復(fù)合變換,這個變換產(chǎn)生了不再相互垂直的坐標(biāo)軸。立方體會變成帶有梯形面的盒子。

圍著一個點旋轉(zhuǎn)

旋轉(zhuǎn)和縮放常常圍繞著當(dāng)前坐標(biāo)系的原點發(fā)生。

圍著一個點縮放

和圍著一個點旋轉(zhuǎn)相似。

7.

透視和平截頭體

OpenGLES使用一個叫做視域(viewing volumn)的幾何圖形來決定一個場景生成的哪些片元將會顯示在最終的渲染結(jié)果中。處于視域范圍之外的幾何圖形都會被剔除,這意味著它會被丟棄。視域有時候也被稱為投影(projection)。

一個立方體或矩形視域叫做一個正攝投影(orthographic)。利用一個正射投影,視點與每個位置之間的距離對于投影毫無影響。

當(dāng)使用投影(perspective projection)時,視域不再是矩形。而是平截頭體。

5-6例子可展現(xiàn)這部分內(nèi)容。

使用視域的另一個關(guān)鍵要認識到,正射和透視投影都是由站在位置{0,0, 0}并向下俯視的z軸的觀察者的視點產(chǎn)生的。本章開頭說變換任意視點稱為可能,但實際上,視點是恒定的。變換會施加到場景中的所有頂點上,并會投影這些頂點到視域的界面上。從概念上看,當(dāng)假設(shè)的觀察者的觀察者的視點不變時,OpenGLES會變換所有的幾何圖形。整個世界移動的錯覺只是看起來像是由視點變換產(chǎn)生的。

總結(jié):

本章介紹了深度緩存、變換、GLKit的矩陣堆棧和視域。實際上本章沒有例子會改變保存在頂點緩存中的頂點的成分。頂點位置保持不變。作為替代,變換改變了頂點被映射到2D像素顏色渲染緩存的方式。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,983評論 6 537
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 98,772評論 3 422
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,947評論 0 381
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,201評論 1 315
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 71,960評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 55,350評論 1 324
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,406評論 3 444
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 42,549評論 0 289
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 49,104評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 40,914評論 3 356
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,089評論 1 371
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,647評論 5 362
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 44,340評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,753評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,007評論 1 289
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,834評論 3 395
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 48,106評論 2 375

推薦閱讀更多精彩內(nèi)容

  • 本文將要介紹圖形渲染管線,它被認為是實時圖形學(xué)中的核心部分。圖形渲染管線的主要功能是在給定了的虛擬攝像機,三維的對...
    SwordMaster閱讀 15,153評論 0 19
  • 目錄 一、多坐標(biāo)系 二、坐標(biāo)空間 三、OpenGL ES 2 3D 空間 四、工程例子 五、參考書籍 一、多坐標(biāo)系...
    半紙淵閱讀 4,093評論 0 5
  • 深度渲染緩存 深度緩存是一個可選的輸出緩存,并且與像素顏色渲染緩存相似,幾乎所有的OpenGL ES都使用深度緩存...
    McDan閱讀 1,635評論 0 0
  • 1 前言 OpenGL渲染3D模型離不開空間幾何的數(shù)學(xué)理論知識,而本篇文章的目的就是對空間幾何進行簡單的介紹,并對...
    RichardJieChen閱讀 7,065評論 1 11
  • 讀了鹽野七生的《羅馬人的故事》2《漢尼拔戰(zhàn)爭》,同時對照閱讀威爾·杜蘭特《世界文明史》第三卷《凱撒與基督》。小西庇...
    劉清閱讀 959評論 4 1