來(lái)自今天openGpu上的一個(gè)
帖子,以前自己對(duì)這塊也是一知半解,導(dǎo)致了曾經(jīng)在一次面試中在這個(gè)問(wèn)題上卡殼(反正最后是沒(méi)過(guò)。。哭。。。),這次看到正好最近看shaderX1里有介紹,所以就一鼓作氣理解下吧!!

這是shaderX1里從vertex到pixelshader之前的pipeline
我具體解釋下從vertex shader到pixel shader中間的部分:
face culling:根據(jù)triangle的兩邊向量叉乘得到的面法線方向來(lái)確定是順時(shí)針還是逆時(shí)針,從而達(dá)到裁剪。
user clip planes:除了使用投影矩陣定義出的6個(gè)clipplane之外我們也可以額外自己定義對(duì)應(yīng)的clipplane來(lái)剪裁。
frustum culling:視錐裁剪,不說(shuō)了
homogeneous divide:這就是你說(shuō)的除以什么w的地方,變換后的定點(diǎn)的xyz均會(huì)除以起w,以opengl的列為主(沒(méi)記錯(cuò)的話。。反正就是matrix X vector的那個(gè)。。)透視投影矩陣的最后一行為0 0 1 0, 所以w值就是未經(jīng)變換前的z值,所以根據(jù)透視投影的特性使得:-1=<x/w<=1, -1=<y/w<=1, -1=<z/w<=1。但是為何我們要這么做捏。。答案是我沒(méi)看懂。。。我覺(jué)得純粹是為了下一步。。下面說(shuō)
viewport mapping:上一步后x,y,z現(xiàn)在已經(jīng)是-1到1之間,上一步的齊次坐標(biāo)系又被稱為normalized device coordinates(NDC),那么我們要將這些頂點(diǎn)映射到屏幕空間就很簡(jiǎn)單了,x = NDC(x) * width + width / 2, y = NDC(y) * height + height/2。
呼。。如果有錯(cuò)的話還請(qǐng)指正哈!~~