溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

OpenGL面剔除方法怎么用

發(fā)布時(shí)間:2022-04-25 15:52:20 來(lái)源:億速云 閱讀:145 作者:iii 欄目:大數(shù)據(jù)

這篇文章主要介紹“OpenGL面剔除方法怎么用”的相關(guān)知識(shí),小編通過(guò)實(shí)際案例向大家展示操作過(guò)程,操作方法簡(jiǎn)單快捷,實(shí)用性強(qiáng),希望這篇“OpenGL面剔除方法怎么用”文章能幫助大家解決問(wèn)題。

現(xiàn)在我們用 OpenGL 繪制了如下的立方體:

OpenGL面剔除方法怎么用    

不管我們?cè)趺葱D(zhuǎn)立方體,從任何一個(gè)方向去看它,最多都只能看到三個(gè)面。

那么對(duì)于 OpenGL 來(lái)說(shuō),那看不到的另外三個(gè)面完全可以不用繪制它,從而提高繪制的性能。

面剔除

既然現(xiàn)在要把看不到的面丟棄,那么問(wèn)題就來(lái)了:

如何去確定哪個(gè)面看得到,哪個(gè)面看不到呢?

在 OpenGL 中允許檢查所有正面朝向觀察者的面,并渲染它們,而丟棄所有背向觀察者的面,這就可以節(jié)省片段著色器的運(yùn)行。

所以,我們要做的就是告訴 OpenGL 哪個(gè)面是正面,哪個(gè)面是背面。 

通過(guò)頂點(diǎn)連接順序確定正反面

當(dāng)我們通過(guò)三角形來(lái)繪制形狀時(shí),會(huì)定義頂點(diǎn)連接的順序,它可能是順時(shí)針或逆時(shí)針。

OpenGL面剔除方法怎么用  
頂點(diǎn)連接順序

上圖中,左側(cè)三角形就是順時(shí)針?lè)较?,右?cè)就是逆時(shí)針?lè)较颉?/p>

而 OpenGL 就是利用這個(gè)三角形的順時(shí)針或逆時(shí)針?lè)较騺?lái)決定三角形是正面還是反面。

默認(rèn)情況下,逆時(shí)針的頂點(diǎn)連接順序被定義為三角形的正面

逆時(shí)針或順時(shí)針都是相對(duì)于觀察者方向的

當(dāng)定義頂點(diǎn)順序時(shí),應(yīng)該想象對(duì)應(yīng)的三角形是面向你的,所以定義的三角形頂點(diǎn)方向應(yīng)該逆時(shí)針的。

這樣定義的好處在于三角形頂點(diǎn)的實(shí)際連接順序是在光柵化階段進(jìn)行的,也就是頂點(diǎn)著色器運(yùn)行之后,這些頂點(diǎn)就是以觀察者視角所見(jiàn)的了。

對(duì)于上圖,左側(cè)三角形 1 -> 2 ->3 的連接順序是順時(shí)針的,這是在觀察者位于屏幕前看到的,如果觀察者位于屏幕后,連接順序依舊是 1 -> 2 -> 3 ,那么就是逆時(shí)針了。

這也是為什么說(shuō),定義三角形頂點(diǎn)順序時(shí)要假設(shè)三角形是面向你的,保證逆時(shí)針定義,并且可以根據(jù)觀察者方向的改變,順時(shí)針和逆時(shí)針?lè)较驎?huì)發(fā)生改變。

如下圖:

OpenGL面剔除方法怎么用  
逆時(shí)針和順時(shí)針三角形的觀察

三角形的頂點(diǎn)順序都 1 -> 2 -> 3,當(dāng)我們定義這個(gè)順序時(shí),都是假設(shè)觀察者正面向這個(gè)三角形呢,所以都是逆時(shí)針定義的。

但是從右側(cè)眼鏡處來(lái)觀察,右側(cè)三角形方向是逆時(shí)針的,左側(cè)三角形方向是順時(shí)針的,這就是因?yàn)閷?duì)于右側(cè)三角形來(lái)說(shuō),觀察者方向和當(dāng)初定義順序時(shí)的假設(shè)方向一致,而對(duì)于左側(cè)三角形,觀察者方向就和定義順序時(shí)的假設(shè)方向相反了,所以從反方向來(lái)看就成了順時(shí)針了。

這樣一來(lái),在面剔除的優(yōu)化下,右側(cè)面可見(jiàn),左側(cè)面不可見(jiàn)了,也就是面向觀察者的正面可見(jiàn),反面不可見(jiàn)了。

看了好多文章,都沒(méi)有講:為什么要逆時(shí)針定義三角形方向,但是觀察時(shí)卻成了順時(shí)針了,就是因?yàn)楫?dāng)初定義的逆時(shí)針?lè)较蚱鋵?shí)是和觀察者方向掛鉤的。

當(dāng)上圖的觀察者方向變成了左側(cè),那么頂點(diǎn)連接順序都還是  1 -> 2 -> 3 的情況下,左側(cè)三角形的順序就和當(dāng)初定義頂點(diǎn)順序一樣成了逆時(shí)針可見(jiàn),而右側(cè)的三角形頂點(diǎn)順序就成了順時(shí)針不可見(jiàn)。

明白了這一點(diǎn),就對(duì)于面剔除更加清晰了。 

具體使用

在 OpenGL 中可以通過(guò)如下方法開(kāi)啟面剔除:

1glEnable(GLES20.GL_CULL_FACE) 

默認(rèn)情況下,面剔除是關(guān)閉的。

開(kāi)啟面剔除后,所有的背向觀察者的面都會(huì)被丟棄,節(jié)省渲染性能。

另外,OpenGL 還提供了其他功能來(lái)選擇要剔除的面。

1    public static native void glCullFace(
2        int mode
3    );
 

有三個(gè)模式可選:

  • GL_BACK:只剔除背向面

  • GL_FRONT:只剔除正向面

  • GL_FRONT_AND_BACK:剔除正向面和背向面

glCullFace 的初始值是 GL_BACK,只剔除背向面。

除了需要剔除的面之外,還可以通過(guò)調(diào)用 glFrontFace 方法告訴 OpenGL 將順時(shí)針的面(而不是逆時(shí)針的面)定義為正向面。

1    public static native void glFrontFace(
2        int mode
3    );
 

它有兩個(gè)選項(xiàng):

  • GL_CCW:代表逆時(shí)針?lè)较驗(yàn)檎蛎?/p>

  • GL_CW:代表順時(shí)針?lè)较驗(yàn)檎蛎?/p>

glFrontFace 模式值是 GL_CCW,逆時(shí)針?lè)较驗(yàn)檎蛎妗?/p>

現(xiàn)假設(shè)開(kāi)啟面剔除,并且剔除正向,順時(shí)針為正向:

1    glEnable(GL_CULL_FACE);
2    glCullFace(GL_FRONT);
3    glFrontFace(GL_CW);

關(guān)于“OpenGL面剔除方法怎么用”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識(shí),可以關(guān)注億速云行業(yè)資訊頻道,小編每天都會(huì)為大家更新不同的知識(shí)點(diǎn)。

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI