在OpenGL中用Projection Matrix 分別左乘和右乘Scale Matrix或Uniformity Diagonal Matrix 的效果
環(huán)境描述
本文所述Projection Matrix均對(duì)應(yīng)右手性(right handedness)的幀(frame)變換竿奏,也即near/far值都為負(fù)值竖瘾,Projection Matrix變換所產(chǎn)生的z-buffer值越大距離眼睛幀數(shù)坐標(biāo)原點(diǎn)(camera)越近透乾。 在OpenGL環(huán)境中對(duì)應(yīng)非默認(rèn)的深度檢測(cè)函數(shù)設(shè)置glDepthFunc(GL_GREATER)怒详。
基準(zhǔn)Projection Matrix變換過(guò)程及成像參數(shù)描述
我們將最初的Projection Matrix對(duì)應(yīng)的MVP變換稱為基準(zhǔn)變換。Vertex Shader在執(zhí)行MVP變換時(shí),實(shí)際應(yīng)用于頂點(diǎn)(Vertices)的順序分別是Model Matrix,View Matrix奸腺,Projection Matrix。其中Model Matrix將對(duì)象坐標(biāo)變換為world coordinate血久,View Matrix將world coordinate變換為眼睛坐標(biāo)(eye coordinate)突照,Projection Matrix將眼睛坐標(biāo)變換為裁切clip coordinate。也就是說(shuō)MVP按照字面順序被先后應(yīng)用于vertex變換氧吐。為了后面描述的方便讹蘑,這里我們將基準(zhǔn)MVP變換的眼睛坐標(biāo)記為[Xe,Ye,Ze,1]?,clip coordinate記為[Xc,Yc,Zc,Wc]?. 在經(jīng)過(guò)clipping和perspective division之后末盔,clip coordinate變換為normalized device coordinate[Xn,Yn,Zn]?。最后normalized device coordinate被用于成像座慰。
注:?[X,Y,Z,W]?標(biāo)記表示集合為垂直集合陨舱。
我們從四種情形分別進(jìn)行討論,首先給定:
P為標(biāo)準(zhǔn)的View Frustum Projection Matrix
S為Scale Affine Matrix(對(duì)角線vector為[3,3,3,1])
O為Uniformity Diagonal Matrix(對(duì)角線vector為[3,3,3,3])版仔。
情形一:將P替換為PS游盲,即Projection Matrix 右乘(right multiplies)Scale Affine Matrix
對(duì)最終成像的影響:成像中可能會(huì)少一些對(duì)象,也可能會(huì)多一些對(duì)象蛮粮,但是和基準(zhǔn)變換相比保留的對(duì)象的成像沒(méi)有變化
這種情況我們按照Vertex Shader變換頂點(diǎn)時(shí)的應(yīng)用順序益缎,在Projection Matrix變換前,對(duì)眼睛坐標(biāo)沿著每個(gè)axis進(jìn)行了3倍放大然想,這樣就獲得了眼睛坐標(biāo)[3Xe,3Ye,3Ze,1]?莺奔。之后眼睛坐標(biāo)被Projection Matrix變換為clip coordinate[3Xc,3Yc,Zc‘,3Wc]?,考慮由于所有新的Xc变泄,Yc令哟,Zc坐標(biāo)的裁切范圍都被放大了3倍,但是其中Zc‘并沒(méi)有同比放大3倍妨蛹,可據(jù)Projection Matrix計(jì)算推算存在可能使得原來(lái)vertex的Zc‘<=-3Wc屏富,可能與基準(zhǔn)變換原來(lái)的頂點(diǎn)相比有一部分深度(Ze值)小的頂點(diǎn)(遠(yuǎn)離相機(jī))會(huì)被裁切,而原來(lái)vertex的Zc'也不如原來(lái)那樣接近3Wc蛙卤,可能會(huì)導(dǎo)致基準(zhǔn)變換被裁切的near值前的一部分點(diǎn)現(xiàn)在不被裁切役听。對(duì)于view frustum中留下的vertex,在執(zhí)行perspective division之后所獲得的normalized device coordinate為[Xn,Yn,Zn‘]?表窘,(Xn,Yn)的值沒(méi)變化甜滨,從而我們看到最終成像和基準(zhǔn)成像沒(méi)變化(除了可能會(huì)少一些原來(lái)的對(duì)象乐严,也可能會(huì)多出一些新對(duì)象外)。
情形二:將P替換為PQ衣摩,即Projection Matrix 右乘(right multiplies)Uniformity Diagonal Matrix
對(duì)最終成像的影響:成像相比基準(zhǔn)成像沒(méi)有任何變化
相比于情形一昂验,scale matrix首先將眼睛坐標(biāo)的每個(gè)部件都放大3倍,包括第4部件-[3Xe,3Ye,3Ze,3]?艾扮。這樣經(jīng)過(guò)projection matrix變換后既琴,我們就獲得新的clip coordinate?[3Xc,3Yc,3Zc,3Wc]。從新的clip coordinate我們可以看出雖然x泡嘴,y甫恩,z軸坐標(biāo)都同比放大3倍,但是w變量也被放大三倍酌予,這樣裁切后相比基準(zhǔn)變化的頂點(diǎn)完全一樣磺箕。再經(jīng)過(guò)perspective division后奖慌,我們獲得和基準(zhǔn)變換完全相同的[Xn,Yn,Zn]?。也就是說(shuō)成像不會(huì)有任何變化松靡。
情形三:將P替換為SP简僧,即Projection Matrix 左乘(left multiplies)Scale Affine Matrix
對(duì)最終成像的影響:成像中對(duì)象的數(shù)目會(huì)經(jīng)歷(可能劇烈)減少,同時(shí)view frustum之外的新頂點(diǎn)不可能再進(jìn)入view frustum之內(nèi)雕欺。相比基準(zhǔn)留下的對(duì)象成像各坐標(biāo)放大3倍岛马,同樣頂點(diǎn)的對(duì)象成像比基準(zhǔn)放大9倍
這種情形我們直接從裁切坐標(biāo)開(kāi)始考慮,我們可以理解為基準(zhǔn)MVP變換后生成裁切坐標(biāo)[Xc,Yc,Zc,Wc]?屠列,然后Scale Matrix將前3個(gè)部件放大3倍成為新的clip coordinate-[3Xc,3Yc,3Zc,Wc]?啦逆。所有的部件都放大3倍,除了W變量(Wc)保留不變脸哀。這會(huì)導(dǎo)致在clipping phase蹦浦,原來(lái)的頂點(diǎn)在x,y撞蜂,z維度上被裁切掉的概率大大增加盲镶。因?yàn)樯傻腣iew Frustum同比放大3倍,而裁切范圍沒(méi)變蝌诡,所以不可能有新的點(diǎn)再進(jìn)入frustum溉贿。在經(jīng)歷perspective division之后,相比原來(lái)的頂點(diǎn)浦旱,獲得的新normalized device coordinate變?yōu)閇3Xn,3Yn,3Zn]?宇色。也就是說(shuō)最終的成像會(huì)放大9倍。
情形四:將P替換為QP颁湖,即Projection Matrix 左乘(left multiplies)Uniformity Diagonal Matrix
對(duì)最終成像的影響:成像相比基準(zhǔn)成像沒(méi)有任何變化
從裁切過(guò)程開(kāi)始同于情形二宣蠕。