2.11 圖元裝配和著色后頂點(diǎn)處理
處理頂點(diǎn)之后,根據(jù)繪制函數(shù)(見(jiàn)2.6.1和2.8)的mode參數(shù),頂點(diǎn)被裝配到圖元中。在接下來(lái)的章節(jié)中將會(huì)介紹圖元裝配的步驟
- 裁剪坐標(biāo)系的透視分割(2.12節(jié))
- 視口映射,包括深度范圍縮放(2.12.1節(jié))
- 圖元側(cè)鍵(2.13節(jié))
- 裁剪可變輸出(2.13.1節(jié))
2.12 坐標(biāo)變換
頂點(diǎn)著色器執(zhí)行后產(chǎn)生一個(gè)頂點(diǎn)坐標(biāo)系gl_Position,這個(gè)坐標(biāo)系被認(rèn)為是裁剪坐標(biāo)。裁剪坐標(biāo)系通過(guò)透視分割后產(chǎn)生歸一化的設(shè)備坐標(biāo)系,再通過(guò)視口轉(zhuǎn)換變成窗口坐標(biāo)系(如果2.4)。
裁剪坐標(biāo)系是一個(gè)四維的齊次向量,按照順序由x,y,z和w坐標(biāo)組成。如果頂點(diǎn)裁剪坐標(biāo)系是
那么頂點(diǎn)的歸一化設(shè)備坐標(biāo)系是:
2.12.1 控制視口
視口變換由視口的像素寬高決定,即,各自的中心點(diǎn)
也是像素衡量的中心。頂點(diǎn)的窗口坐標(biāo)
通過(guò)下面計(jì)算得到:
作用于的因子和偏移量由
和
共同決定,使用函數(shù):
void DepthRangef(clampf n, clampf f)
每個(gè)n和f都被限制在[0,1]中,所有的參數(shù)都是clampf類(lèi)型。是被認(rèn)為是以固定點(diǎn)表示的,其位數(shù)至少和幀緩沖區(qū)的深度緩沖區(qū)的位數(shù)相同,如果用在2.1.2節(jié)中幀緩沖區(qū)部分中描述的那樣。
視口轉(zhuǎn)換參數(shù)被指定使用:
void Viewport(int x, int y ,sizei w, sizei h)
其中,x和y給出了視口左下角的窗口坐標(biāo)系的x和y值,w和h各自給出了視口的長(zhǎng)和寬。視口的參數(shù)在上面的等式中通過(guò)這些值建立:,,
當(dāng)被指定時(shí),視口的寬和長(zhǎng)會(huì)被牽拉到實(shí)現(xiàn)相關(guān)的最大值。最大的長(zhǎng)寬值可以調(diào)用一個(gè)合適的Get函數(shù)來(lái)查詢(xún)到(見(jiàn)第6章)。最大的視口維度必須要大于或者等于要被渲染顯示的可視的維度。w或者h(yuǎn)如果是負(fù)的,將會(huì)產(chǎn)生INVALED_VALUE錯(cuò)誤。
實(shí)現(xiàn)視口轉(zhuǎn)換需要四個(gè)整形數(shù)和兩個(gè)固定的浮點(diǎn)值。在初始狀態(tài),w和h各自被設(shè)置為窗口的寬和高,然后傳遞給GL做渲染。被設(shè)置為
。n和f分別被設(shè)置為0.0和1.0。
2.13 圖元裁剪
圖元按照裁剪量裁剪,在裁剪坐標(biāo)系中,裁剪量被定義為
如果要處理的圖元是點(diǎn),這個(gè)點(diǎn)在近裁剪平面和遠(yuǎn)裁剪平面之外,裁剪機(jī)制將會(huì)忽略這個(gè)點(diǎn)。
如果要處理的圖元是一個(gè)線(xiàn)段,整個(gè)線(xiàn)段都在近裁剪平面和遠(yuǎn)裁剪平面之內(nèi),裁剪機(jī)制不會(huì)做處理,如果整個(gè)線(xiàn)段都在兩個(gè)裁剪平面之外,裁剪機(jī)制也會(huì)忽略它。
如果線(xiàn)段的一部分在倆那個(gè)裁剪平面之內(nèi),另一部分在外面,那么線(xiàn)段將會(huì)根據(jù)倆那個(gè)平面重新裁剪,并且頂點(diǎn)的頂點(diǎn)坐標(biāo)系也會(huì)重新計(jì)算。
裁剪操作產(chǎn)生一個(gè)值,對(duì)每個(gè)裁剪操作過(guò)的頂點(diǎn)都有。如果裁剪過(guò)的頂點(diǎn)的坐標(biāo)系為P,原始的頂點(diǎn)坐標(biāo)系為P1和P2,那么
有下面公式給出:
如果圖元是三角形,每個(gè)邊緣全部都在裁剪區(qū)域內(nèi)才會(huì)被執(zhí)行,部分在外的頂點(diǎn)會(huì)被裁剪,全部在外的頂點(diǎn)也會(huì)被忽略。裁剪操作會(huì)引起三角形的邊被裁剪,但因?yàn)檫B接性必須被保持,這些被裁剪的邊使用裁剪時(shí)裁剪區(qū)域的邊際產(chǎn)生的新的邊來(lái)重新連接起來(lái)。因此,裁剪操作可能會(huì)引進(jìn)一個(gè)新的頂點(diǎn)給三角形,從而編程一個(gè)廣義上的多邊形。
如果一個(gè)三角形和裁剪區(qū)域的邊界相交,被裁剪的三角形必須包含這個(gè)邊界上的一點(diǎn)。
線(xiàn)段或者三角形的頂點(diǎn)擁有不同符號(hào)的值時(shí),可能會(huì)在裁剪操作之后產(chǎn)生多個(gè)相互連接的部分。GL的實(shí)現(xiàn)不要求處理這種情況。這意味著,只有在
的區(qū)域中的圖元的部分需要被裁剪操作處理。
2.13.1 裁剪變量輸出
之后,頂點(diǎn)著色器的varying變量被裁剪了。在裁剪區(qū)域中的頂點(diǎn)和相關(guān)的varying變量的值不受裁剪操作影響。如果圖元被裁剪了,通過(guò)裁剪操作產(chǎn)生的分配給頂點(diǎn)的varying值就是裁剪過(guò)后的值。
未裁剪的邊上的兩個(gè)頂點(diǎn)P1和P2分配的varying變量的值為c1和c2。對(duì)于一個(gè)裁剪過(guò)的P值,其的值(見(jiàn)2.13)通常和P的值有以下關(guān)系:
(通過(guò)放縮因子放縮一個(gè)varying變量的值意味著放縮每一個(gè)x,y,z和w的值)
多邊形裁剪操作可能會(huì)產(chǎn)生一個(gè)沿著裁剪區(qū)域邊界的被裁剪的頂點(diǎn)。多邊形裁剪是通過(guò)一次裁剪剪輯區(qū)域邊界的一個(gè)平面來(lái)處理這種情況的。varying值的裁剪操作也是這樣完成的,被才見(jiàn)的點(diǎn)總是出現(xiàn)在多邊形的邊和裁剪區(qū)域邊界相交的地方。