軟件光柵化(確定3d三角形的三個(gè)頂點(diǎn)的坐標(biāo)位置。)

光柵化全過程

計(jì)算三個(gè)點(diǎn)的坐標(biāo)磷支,那么熟悉模型的朋友應(yīng)該知道要有兩個(gè)數(shù)據(jù)谒撼,一個(gè)是頂點(diǎn)坐標(biāo)數(shù)據(jù),一個(gè)是頂點(diǎn)索引數(shù)據(jù)雾狈,在dx11和opengl中廓潜,都會把這兩個(gè)數(shù)據(jù)緩存在硬件緩存區(qū)中,軟件光柵化箍邮,我們拿到這兩個(gè)數(shù)據(jù)茉帅,取出一個(gè)三角形的三個(gè)點(diǎn)的坐標(biāo),通過mvp變換就可以完成坐標(biāo)得一部分轉(zhuǎn)換锭弊,但是還有一部分是什么呢堪澎?如上圖,乘上mvp矩陣后味滞,也就相當(dāng)于完成了投影變換樱蛤,僅此而已钮呀,下邊的步驟一般是硬件為我們完成的,但是軟件光柵化不借助任何gpu昨凡,就cpu爽醋,那就開始一步步算嘛,從裁剪坐標(biāo)系開始吧便脊!

為什么要裁剪坐標(biāo)系蚂四,因?yàn)樵诮仡^體內(nèi)部,有時(shí)候模型在截頭體內(nèi)部放不下哪痰,超出部分需要被剪裁遂赠,這個(gè),過程網(wǎng)上說的各種復(fù)雜晌杰,簡單用代碼來說就是


//檢查齊次坐標(biāo)同 cvv 的邊界用于視錐裁剪

int transform_check_cvv(const vector_t*v) {

????float????w = v->w;

????int????check =0;

????if(v->z<0.0f) check |=1;

????if(v->z>? w) check |=2;

????if(v->x< -w) check |=4;

????if(v->x>? w) check |=8;

????if(v->y< -w) check |=16;

????if(v->y>? w) check |=32;

return????check;

}

在上述代碼中可見跷睦,其實(shí)就是很簡單做了一下判斷是否在截頭體內(nèi)部,一個(gè)三角形可能完全在截頭體內(nèi)部肋演,也可能完全在截頭體外部抑诸,也可能部分在截頭體內(nèi)部,完全在內(nèi)部的不用管嘛爹殊,但是完全在外邊的需要剔除蜕乡,部分在截頭體外部的,需要舍去在外部的部分边灭,重新把在內(nèi)部的部分進(jìn)行分割成兩個(gè)三角形再次進(jìn)行處理异希。

PS:當(dāng)然上邊代碼只是簡單判斷下一個(gè)點(diǎn)是否在三角形內(nèi)部啦,代碼來自韋易笑大神

好了裁剪完了绒瘦,就開始下一步進(jìn)行透視除法嘍称簿,就是把一個(gè)點(diǎn)的(x, y, z, w)都除以w變成(x/w, y/w, z/w, 1)變成ndc中的坐標(biāo),

簡單來說就是照著做就完事了惰帽,復(fù)雜來說憨降,去看龍書有具體為什么這么做。该酗。授药。(當(dāng)然我寫這個(gè)只是為了初學(xué)者腦子里有個(gè)大體步驟思路,不深究呜魄,容易帶丟了給)

下邊是視口變換原理推導(dǎo)悔叽,簡單來說就是ndc變換到屏幕上的坐標(biāo)

其中

ndc的坐標(biāo)范圍是


而viewport的坐標(biāo)范圍是

注:由上圖知,視口的起點(diǎn)為(X, Y)爵嗅,寬高分別為Width和Height娇澎,x軸向右為正,y軸向下為正睹晒,y軸的方向與三維坐標(biāo)正好相反趟庄。視口是一個(gè)2D平面括细,但是在viewport變換中,Z坐標(biāo)也是跟著變換的戚啥,只是在這個(gè)圖中沒有體現(xiàn)奋单。

先求變換矩陣的第一列

ndc中的左上角點(diǎn)(-1, 1, 0, 1)映射到viewport中的起點(diǎn)(X, Y, MinZ, 1),

ndc中的右上角點(diǎn)(1, 1, 0, 1)映射到viewport中的點(diǎn)(X+Width, Y, MinZ, 1),

假設(shè)變換矩陣的第一列為[x’, y’, z’, 1]T據(jù)矩陣乘法有

[-1, 1, 0, 1]* [x’, y’, z’, 1]T?= X

[1, 1, 0, 1]* [x’, y’, z’, 1]T?= X+Width

對應(yīng)的兩個(gè)方程為

-1*x’ + 1*y’ + 0*z’ + 1*w’ = X

1*x’ + 1*y’ + 0*z’ + 1*w’ = X+Width

解之得

x’ = Width/2

y’ = 0

z’ = 0

w’ = x + Width/2

再求第二列

列方程(這里省略了x’,z’,但結(jié)果不變猫十,下同)

y’ + 1*w’=Y

-1*y’ + 1*w’=Y+Height

解之得

y’ = -Height/2

w’ = Y + Height/2

最后求第三列

列方程

0*z’ + 1*w’ = MinZ

1*z’ + 1*w’ = MaxZ

解之得

z’ = MaxZ – MinZ

w’ = MinZ

組合以上各列览濒,得到視口變換矩陣


然后 嘿嘿嘿,坐標(biāo)算出來了l挪省X移摺P醵獭江兢!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市丁频,隨后出現(xiàn)的幾起案子杉允,更是在濱河造成了極大的恐慌,老刑警劉巖席里,帶你破解...
    沈念sama閱讀 218,941評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件叔磷,死亡現(xiàn)場離奇詭異,居然都是意外死亡奖磁,警方通過查閱死者的電腦和手機(jī)改基,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,397評論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來咖为,“玉大人秕狰,你說我怎么就攤上這事≡耆荆” “怎么了鸣哀?”我有些...
    開封第一講書人閱讀 165,345評論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長吞彤。 經(jīng)常有香客問我我衬,道長,這世上最難降的妖魔是什么饰恕? 我笑而不...
    開封第一講書人閱讀 58,851評論 1 295
  • 正文 為了忘掉前任挠羔,我火速辦了婚禮,結(jié)果婚禮上埋嵌,老公的妹妹穿的比我還像新娘破加。我一直安慰自己,他們只是感情好莉恼,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,868評論 6 392
  • 文/花漫 我一把揭開白布拌喉。 她就那樣靜靜地躺著速那,像睡著了一般。 火紅的嫁衣襯著肌膚如雪尿背。 梳的紋絲不亂的頭發(fā)上端仰,一...
    開封第一講書人閱讀 51,688評論 1 305
  • 那天,我揣著相機(jī)與錄音田藐,去河邊找鬼荔烧。 笑死,一個(gè)胖子當(dāng)著我的面吹牛汽久,可吹牛的內(nèi)容都是我干的鹤竭。 我是一名探鬼主播,決...
    沈念sama閱讀 40,414評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼景醇,長吁一口氣:“原來是場噩夢啊……” “哼臀稚!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起三痰,我...
    開封第一講書人閱讀 39,319評論 0 276
  • 序言:老撾萬榮一對情侶失蹤吧寺,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后散劫,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體稚机,經(jīng)...
    沈念sama閱讀 45,775評論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,945評論 3 336
  • 正文 我和宋清朗相戀三年获搏,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了赖条。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,096評論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡常熙,死狀恐怖纬乍,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情症概,我是刑警寧澤蕾额,帶...
    沈念sama閱讀 35,789評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站彼城,受9級特大地震影響诅蝶,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜募壕,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,437評論 3 331
  • 文/蒙蒙 一调炬、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧舱馅,春花似錦缰泡、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,993評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽缠借。三九已至,卻和暖如春宜猜,著一層夾襖步出監(jiān)牢的瞬間泼返,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,107評論 1 271
  • 我被黑心中介騙來泰國打工姨拥, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留绅喉,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,308評論 3 372
  • 正文 我出身青樓叫乌,卻偏偏與公主長得像柴罐,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子憨奸,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,037評論 2 355

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

  • 本文首發(fā)于個(gè)人博客:Lam's Blog - 【OpenGL ES】入門及繪制一個(gè)三角形革屠,文章由MarkDown語...
    格子林ll閱讀 7,274評論 2 18
  • 本文將要介紹圖形渲染管線,它被認(rèn)為是實(shí)時(shí)圖形學(xué)中的核心部分膀藐。圖形渲染管線的主要功能是在給定了的虛擬攝像機(jī)屠阻,三維的對...
    SwordMaster閱讀 15,127評論 0 19
  • 圖元處理(Primitive Processing) 如何在場景中使用曲面細(xì)分來添加幾何細(xì)節(jié) 如何使用幾何著色器處...
    RichardJieChen閱讀 6,899評論 2 4
  • 一. 環(huán)境搭建 需要準(zhǔn)備資源GLTools 工具類和libGLTools.a文件 如下: 包含了一個(gè)可移動正方塊的...
    TeeMo_Yan閱讀 383評論 1 1
  • “師傅,為什么我名字叫二九”小道士問 “因?yàn)槟阈r(shí)候你娘把你送上山那天是農(nóng)歷二月九啊”中年道士答 “咱們道觀起道號...
    說書人留白雪閱讀 278評論 0 0