OpenGL之離屏渲染

2021-10-10 22:48:55 字數 3856 閱讀 2084

off-screen rendering意為離屏渲染,指的是gpu在當前螢幕緩衝區以外新開闢乙個緩衝區進行渲染操作

因為在幀緩衝區渲染乙個檢視到螢幕中就拋棄的機制.所以當我們有多組檢視需要組合隨後統一處理的時候.需要在屏緩衝區額外開闢乙個離屏的緩衝區去記錄這些檢視.隨後統一處理.最後渲染顯示出來

我們首先分析圓角產生離屏渲染的情況:

回顧一下.當我們給乙個檢視新增cornerradius時.是給哪些檢視新增了圓角?
蘋果官方的解答是:

即背景檢視以及邊框等檢視,不包含contents檢視.所以當我們只設定cornerradius時.不設定maskstobounds為yes.檢視視覺上還是沒產生圓角

隨後我們對以下四種情況分別做圓角處理

a.按鈕檢視設定.並且設定圓角cornerradius和裁剪maskstobounds.會產生離屏渲染

b.按鈕檢視不設定.設定圓角cornerradius和裁剪maskstobounds.不會產生離屏渲染

c.檢視不設定背景色.設定圓角cornerradius和裁剪maskstobounds.不會產生離屏渲染

d.檢視設定背景色.設定圓角cornerradius和裁剪maskstobounds.會產生離屏渲染

相關**如下:

//設定會產生離屏渲染

uibutton * btn1 = [uibutton buttonwithtype:(uibuttontypecustom)];

btn1.frame = cgrectmake(100, 30, 100, 100);

[btn1 setimage:[uiimage imagenamed:@"wx20201127-92813"] forstate:uicontrolstatenormal];

[self.view addsubview:btn1];

btn1.layer.cornerradius = 50;

btn1.layer.maskstobounds = yes;

//只設定背景色不會產生離屏渲染

uibutton * btn2 = [uibutton buttonwithtype:(uibuttontypecustom)];

btn2.frame = cgrectmake(100, 150, 100, 100);

btn2.backgroundcolor = uicolor.graycolor;

[self.view addsubview:btn2];

btn2.layer.cornerradius = 50;

btn2.layer.maskstobounds = yes;

//對於來說.設定背景色以及就會產生離屏渲染.不設定就不會

uiimageview * img1 = [[uiimageview alloc]initwithimage:[uiimage imagenamed:@"wx20201127-92813"]];

img1.frame = cgrectmake(100, 270, 100, 100);

img1.backgroundcolor = uicolor.bluecolor;

img1.layer.cornerradius = 50;

img1.layer.maskstobounds = yes;

[self.view addsubview:img1];

uiimageview * img2 = [[uiimageview alloc]initwithimage:[uiimage imagenamed:@"wx20201127-92813"]];

img2.frame = cgrectmake(100, 390, 100, 100);

img2.layer.cornerradius = 50;

img2.layer.maskstobounds = yes;

[self.view addsubview:img2];

效果如下:

那什麼情況下會產生離屏渲染呢? 我們得出的表象結論是:

1.按鈕新增以後做圓角處理

2.檢視新增背景色和以後做圓角處理

接下來.我們將img2進行改進: 給tempview不加背景色不會產生離屏渲染.給tempview新增背景色還是會產生離屏渲染

由此我們可以知道:當我們需要對多個圖層進行組合處理時就需要使用到離屏渲染技術.將多個圖層組合渲染完畢以後放到幀緩衝區.顯示到螢幕中

需要注意的是.以上是組合.而不是疊加.
那麼我們平時使用的檢視有哪些是組合.並且需要做離屏渲染的呢?

2.mask遮罩

3.光柵化

4.組合檢視設定透明度

5.陰影

6.漸變

7.繪製文字

8.系統毛玻璃效果

1.針對圓角的離屏渲染的情況.我們可以通過四種方案.

a.使用乙個鏤空圓角檢視蓋在上面

b.使用yyimage裡面的圓角方法

c.通過calayeruibezierpath結合使用的

uigraphicsbeginimagecontextwithoptions(size, false, scale)

uibezierpath.init(roundedrect: imgrect, cornerradius: self.layer.cornerradius).addclip()

self.image?.draw(in: imgrect)

self.image = uigraphicsgetimagefromcurrentimagecontext()

uigraphicsendimagecontext()

2.如果檢視不能被復用.並且不是靜態.需要被頻繁修改的情況不建議開啟光柵化.因為這樣會開啟離屏渲染會影響效率 3.盡量少使用或不使用透明度 4.非同步繪製.減少圖層

iOS之離屏渲染

on screen rendering 意為當前螢幕渲染,指的是gpu的渲染操作是在當前用於顯示的螢幕緩衝區中進行。off screen rendering 意為離屏渲染,指的是gpu在當前螢幕緩衝區以外新開闢乙個緩衝區進行渲染操作。特殊的離屏渲染 如果將不在gpu的當前螢幕緩衝區中進行的渲染都稱為...

OpenGL基礎33 幀緩衝(上)之離屏渲染

在之前的章節,所有的物體都是中規中矩的顯示的,只考慮了光照對物體的影響,那假設想要顯示特殊的效果該怎麼操作呢?例如馬賽克風 將所有的物體都顯示為黑白色,就像上世紀80年代的灰白電視一樣,又或者說將整個場景渲染到一張泛黃的紙上以體現出年代感 當然是修改著色器,事實上,很多地方都是這麼做的,不過有些情況...

OpenGL於MFC使用彙總(三) 離屏渲染

有時直接建立opengl形式不適合,或者乾脆不同意然後建立乙個表單,正如我現在這個專案,建立窗體不顯示,它僅限於主框架。而我只是activex裡做一些相關工作,那僅僅能用到opengl的離屏渲染技術了 即不直接繪製到窗體上,而是繪製到一張點陣圖上。然後再次呼叫這張位圖實現興許的工作。以下就總結怎麼使...