OpenGL 學(xué)了那么久了,glViewport 你真的會(huì)用嗎?
OpenGL中的 glViewport 函數(shù)用于定義視口(Viewport),即確定窗口中顯示的區(qū)域。它的定義如下:
void glViewport(GLint x, GLint y, GLsizei width, GLsizei height);
參數(shù)解釋:
- x:視口的左下角X坐標(biāo)。
- y:視口的左下角Y坐標(biāo)。
- width:視口的寬度。
- height:視口的高度。
glViewport函數(shù)的作用是將正投影坐標(biāo)(OpenGL的默認(rèn)坐標(biāo)系)映射到屏幕上實(shí)際顯示的區(qū)域。它將正投影坐標(biāo)系中的點(diǎn)映射到屏幕上指定大小的矩形區(qū)域內(nèi)。
在使用OpenGL進(jìn)行繪圖時(shí),我們通常需要先通過glViewport來設(shè)置視口,將整個(gè)窗口或窗口的一部分作為渲染區(qū)域。這樣,我們可以指定繪制的內(nèi)容在窗口的哪個(gè)位置顯示出來。
正常顯示時(shí)的參數(shù)
這里傳入的參數(shù)為 glViewport(0,0,width,height) ,此時(shí)數(shù)據(jù)可以正常渲染到屏幕上。

只改變width參數(shù)
這里傳入的參數(shù)為 glViewport(0,0,width/2,height),此時(shí)數(shù)據(jù)和正常時(shí)相比寬度變成了之前的一半。
由此可以說明右側(cè)為x的正方向。且數(shù)據(jù)的寬是由x和width控制的。

只改變 height 參數(shù)
這里傳入的參數(shù)為 glViewport(0,0,width,height/2) ,此時(shí)數(shù)據(jù)和正常時(shí)相比高度變成了之前的一半。
由此可以說明上方為y的正方向。 且數(shù)據(jù)的高是由 y 和 height 控制的。

同時(shí)改變 width 和 height 參數(shù)
這里傳入的參數(shù)為 glViewport(0,0,width/2,height/2) ,此時(shí)數(shù)據(jù)和正常時(shí)相比寬度變成了之前的一半,高度也變成了之前的一半。
由此可以說明渲染到屏幕的數(shù)據(jù)具體大小,是x,y,width,height共同控制的(貌似是句廢話)

只改變 x 參數(shù)
這里傳入的參數(shù)為 glViewport(width/2,0,width,height) ,此時(shí)數(shù)據(jù)和正常時(shí)相比。大小沒有變化,整體向右偏移了width/2個(gè)像素。且超出部分沒有顯示
由此可以說明數(shù)據(jù)x軸的起始位置由x參數(shù)控制,如果 x+width>width 即超出了屏幕像素的寬,x方向超出部分將不顯示。

只改變 y 參數(shù)
這里傳入的參數(shù) 為 glViewport(0,height/2,width,height) ,此時(shí)數(shù)據(jù)和正常時(shí)相比。 大小沒有變化,整體向上偏移了height/2個(gè)像素。 且超出部分沒有顯示

同時(shí)改變x,y參數(shù)
這里傳入的參數(shù)為 glViewport(width/2,height/2,width,height) ,此時(shí)數(shù)據(jù)和正常時(shí)相比。大小沒有變化,整體向上偏移了height/2個(gè)像素,且超出部分沒有顯示。
由此可以說明數(shù)據(jù)y軸的起始位置由y參數(shù)控制,如果y+height>height即超出了屏幕像素的高,y方向超出的部分將不顯示。

同時(shí)改變x,y,width,height,參數(shù)
這里傳入的參數(shù)為 glViewport(width/2,height/2,width/2,height/2) 。 此時(shí)數(shù)據(jù)和正常時(shí)相比。 起始位置為屏幕正中間(width/2,height/2),寬高分別為: width/2,height/2。
可以正常繪制,沒有超出屏幕范圍,且大小為正常渲染的四分之一。

x,y為以控件左下角為起始坐標(biāo),對(duì)應(yīng)渲染紋理的左下角:
右為x軸的正方向。
上為y軸的正方向。
width,height是以x,y為起始位置的寬和高,用來確定渲染出的數(shù)據(jù)到屏幕的位置。
用戶可以通過該接口,控制數(shù)據(jù)渲染到屏幕的具體位置和范圍。
-- END --
進(jìn)技術(shù)交流群,掃碼添加我的微信:Byte-Flow
獲取相關(guān)資料和源碼
推薦:
Android FFmpeg 實(shí)現(xiàn)帶濾鏡的微信小視頻錄制功能
全網(wǎng)最全的 Android 音視頻和 OpenGL ES 干貨,都在這了
所有你想要的圖片轉(zhuǎn)場(chǎng)效果,都在這了
