十年網(wǎng)站開(kāi)發(fā)經(jīng)驗(yàn) + 多家企業(yè)客戶 + 靠譜的建站團(tuán)隊(duì)
量身定制 + 運(yùn)營(yíng)維護(hù)+專業(yè)推廣+無(wú)憂售后,網(wǎng)站問(wèn)題一站解決
這篇文章主要介紹“OpenGL面剔除方法怎么用”的相關(guān)知識(shí),小編通過(guò)實(shí)際案例向大家展示操作過(guò)程,操作方法簡(jiǎn)單快捷,實(shí)用性強(qiáng),希望這篇“OpenGL面剔除方法怎么用”文章能幫助大家解決問(wèn)題。
成都創(chuàng)新互聯(lián)公司網(wǎng)站建設(shè)公司提供網(wǎng)站設(shè)計(jì)和自適應(yīng)建站服務(wù)。團(tuán)隊(duì)由有經(jīng)驗(yàn)的網(wǎng)頁(yè)設(shè)計(jì)師、程序員和市場(chǎng)專家組成,能夠提供從成都h5網(wǎng)站建設(shè),網(wǎng)站制作,1元廣告,模板建站到重慶小程序開(kāi)發(fā)等全方位服務(wù)。 以客戶為中心,致力于為客戶提供創(chuàng)新、高效的解決方案,幫助您打造成功的企業(yè)網(wǎng)站。
現(xiàn)在我們用 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è)面是背面。
當(dāng)我們通過(guò)三角形來(lái)繪制形狀時(shí),會(huì)定義頂點(diǎn)連接的順序,它可能是順時(shí)針或逆時(shí)針。
上圖中,左側(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ā)生改變。
如下圖:
三角形的頂點(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)注創(chuàng)新互聯(lián)行業(yè)資訊頻道,小編每天都會(huì)為大家更新不同的知識(shí)點(diǎn)。