這篇文章主要介紹“OpenGL面剔除方法怎么用”的相關知識,小編通過實際案例向大家展示操作過程,操作方法簡單快捷,實用性強,希望這篇“OpenGL面剔除方法怎么用”文章能幫助大家解決問題。
成都創(chuàng)新互聯(lián)公司網(wǎng)站建設公司提供網(wǎng)站設計和自適應建站服務。團隊由有經(jīng)驗的網(wǎng)頁設計師、程序員和市場專家組成,能夠提供從成都h5網(wǎng)站建設,網(wǎng)站制作,1元廣告,模板建站到重慶小程序開發(fā)等全方位服務。 以客戶為中心,致力于為客戶提供創(chuàng)新、高效的解決方案,幫助您打造成功的企業(yè)網(wǎng)站。
現(xiàn)在我們用 OpenGL 繪制了如下的立方體:
不管我們怎么旋轉立方體,從任何一個方向去看它,最多都只能看到三個面。
那么對于 OpenGL 來說,那看不到的另外三個面完全可以不用繪制它,從而提高繪制的性能。
既然現(xiàn)在要把看不到的面丟棄,那么問題就來了:
如何去確定哪個面看得到,哪個面看不到呢?
在 OpenGL 中允許檢查所有正面朝向觀察者的面,并渲染它們,而丟棄所有背向觀察者的面,這就可以節(jié)省片段著色器的運行。
所以,我們要做的就是告訴 OpenGL 哪個面是正面,哪個面是背面。
當我們通過三角形來繪制形狀時,會定義頂點連接的順序,它可能是順時針或逆時針。
上圖中,左側三角形就是順時針方向,右側就是逆時針方向。
而 OpenGL 就是利用這個三角形的順時針或逆時針方向來決定三角形是正面還是反面。
默認情況下,逆時針的頂點連接順序被定義為三角形的正面
逆時針或順時針都是相對于觀察者方向的
當定義頂點順序時,應該想象對應的三角形是面向你的,所以定義的三角形頂點方向應該逆時針的。
這樣定義的好處在于三角形頂點的實際連接順序是在光柵化階段進行的,也就是頂點著色器運行之后,這些頂點就是以觀察者視角所見的了。
對于上圖,左側三角形 1 -> 2 ->3 的連接順序是順時針的,這是在觀察者位于屏幕前看到的,如果觀察者位于屏幕后,連接順序依舊是 1 -> 2 -> 3 ,那么就是逆時針了。
這也是為什么說,定義三角形頂點順序時要假設三角形是面向你的,保證逆時針定義,并且可以根據(jù)觀察者方向的改變,順時針和逆時針方向會發(fā)生改變。
如下圖:
三角形的頂點順序都 1 -> 2 -> 3,當我們定義這個順序時,都是假設觀察者正面向這個三角形呢,所以都是逆時針定義的。
但是從右側眼鏡處來觀察,右側三角形方向是逆時針的,左側三角形方向是順時針的,這就是因為對于右側三角形來說,觀察者方向和當初定義順序時的假設方向一致,而對于左側三角形,觀察者方向就和定義順序時的假設方向相反了,所以從反方向來看就成了順時針了。
這樣一來,在面剔除的優(yōu)化下,右側面可見,左側面不可見了,也就是面向觀察者的正面可見,反面不可見了。
看了好多文章,都沒有講:為什么要逆時針定義三角形方向,但是觀察時卻成了順時針了,就是因為當初定義的逆時針方向其實是和觀察者方向掛鉤的。
當上圖的觀察者方向變成了左側,那么頂點連接順序都還是 1 -> 2 -> 3 的情況下,左側三角形的順序就和當初定義頂點順序一樣成了逆時針可見,而右側的三角形頂點順序就成了順時針不可見。
明白了這一點,就對于面剔除更加清晰了。
在 OpenGL 中可以通過如下方法開啟面剔除:
1glEnable(GLES20.GL_CULL_FACE)
默認情況下,面剔除是關閉的。
開啟面剔除后,所有的背向觀察者的面都會被丟棄,節(jié)省渲染性能。
另外,OpenGL 還提供了其他功能來選擇要剔除的面。
1 public static native void glCullFace(
2 int mode
3 );
有三個模式可選:
GL_BACK:只剔除背向面
GL_FRONT:只剔除正向面
GL_FRONT_AND_BACK:剔除正向面和背向面
glCullFace 的初始值是 GL_BACK,只剔除背向面。
除了需要剔除的面之外,還可以通過調用 glFrontFace 方法告訴 OpenGL 將順時針的面(而不是逆時針的面)定義為正向面。
1 public static native void glFrontFace(
2 int mode
3 );
它有兩個選項:
GL_CCW:代表逆時針方向為正向面
GL_CW:代表順時針方向為正向面
glFrontFace 模式值是 GL_CCW,逆時針方向為正向面。
現(xiàn)假設開啟面剔除,并且剔除正向,順時針為正向:
1 glEnable(GL_CULL_FACE);
2 glCullFace(GL_FRONT);
3 glFrontFace(GL_CW);
關于“OpenGL面剔除方法怎么用”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關的知識,可以關注創(chuàng)新互聯(lián)行業(yè)資訊頻道,小編每天都會為大家更新不同的知識點。