OpenGL ES手冊(cè)翻譯---2.OpenGL ES操作(四)

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é))
image

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)系是
\begin{pmatrix} x_c \\ y_c \\ z_c \\ w_c \\ \end{pmatrix}
那么頂點(diǎn)的歸一化設(shè)備坐標(biāo)系是:
\begin{pmatrix} x_d \\ y_d \\ z_d \end{pmatrix} = \begin{pmatrix} \frac {x_c} {w_c} \\ \frac {y_c} {w_c} \\ \frac {z_c} {w_c} \end{pmatrix}

2.12.1 控制視口

視口變換由視口的像素寬高決定,即p_x,p_y,各自的中心點(diǎn)(o_x,o_y)也是像素衡量的中心。頂點(diǎn)的窗口坐標(biāo)\begin{pmatrix} x_w\\ y_w \\ z_w \end{pmatrix} 通過(guò)下面計(jì)算得到:

\begin{pmatrix} x_w \\ y_w \\ z_w \end{pmatrix} = \begin{pmatrix} \frac {p_x} {2}x_d + o_x \\ \frac {p_y} {2}y_d + o_y \\ \frac {f-n} {2}z_d + \frac {n+f} {2} \end{pmatrix}
作用于z_d的因子和偏移量由nf共同決定,使用函數(shù):

void DepthRangef(clampf n, clampf f)

每個(gè)nf都被限制在[0,1]中,所有的參數(shù)都是clampf類(lèi)型。z_w是被認(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ò)這些值建立:o_x = x + \frac {w} {2},o_y = y + \frac {h} {2},p_x = w, p_y = h

當(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做渲染。o_x,o_y被設(shè)置為\frac {w} {2}, \frac {h} {2}。n和f分別被設(shè)置為0.0和1.0。

2.13 圖元裁剪

圖元按照裁剪量裁剪,在裁剪坐標(biāo)系中,裁剪量被定義為

-w_c \le x_c \le w_c \\ -w_c \le y_c \le w_c \\ -w_c \le z_c \le w_c \\

如果要處理的圖元是點(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)都有0 \le t \le 1。如果裁剪過(guò)的頂點(diǎn)的坐標(biāo)系為P,原始的頂點(diǎn)坐標(biāo)系為P1P2,那么t有下面公式給出:
P = tP_1 + (1-t)P_2

如果圖元是三角形,每個(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)的w_c值時(shí),可能會(huì)在裁剪操作之后產(chǎn)生多個(gè)相互連接的部分。GL的實(shí)現(xiàn)不要求處理這種情況。這意味著,只有在w_c > 0的區(qū)域中的圖元的部分需要被裁剪操作處理。

2.13.1 裁剪變量輸出

之后,頂點(diǎn)著色器的varying變量被裁剪了。在裁剪區(qū)域中的頂點(diǎn)和相關(guān)的varying變量的值不受裁剪操作影響。如果圖元被裁剪了,通過(guò)裁剪操作產(chǎn)生的分配給頂點(diǎn)的varying值就是裁剪過(guò)后的值。

未裁剪的邊上的兩個(gè)頂點(diǎn)P1P2分配的varying變量的值為c1和c2。對(duì)于一個(gè)裁剪過(guò)的P值,其t的值(見(jiàn)2.13)通常和P的值有以下關(guān)系:
c = tc_1 + (1-t)c_2
(通過(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ū)域邊界相交的地方。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀(guān)點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容