日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

android 滤镜 原理,android openglse实现滤镜九宫格

發布時間:2024/1/8 编程问答 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 android 滤镜 原理,android openglse实现滤镜九宫格 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

opengl的渲染之前講過很多,包括FBO等常用的技術(可參考我的博客:fbo),今天解決之前的一個小疑問:手機系統相機中,九宮格的濾鏡選擇是如何實現的,今天閑暇就實現起來看看,同時開放出來之前私有的相機項目:LammyOpenglCamera

原理:先利用fbo,將相機數據繪制到一個紋理當中,然后將紋理設置到不同的filter,利用 glViewport來確定繪制窗口位置,然后利用不同的filter繪制在一個glsurfaceview不同的位置。

確定濾鏡的位置

過濾格子位置不包含間隔

如圖,假如每個格子代表一個濾鏡的顯示,不包含過濾之間的間隔,為何這樣標記主要是因為 glViewport的參數坐標是 左下角為圓心的。

為了符合應用的審美習慣,從左上角開始顯示filter,因此,在結算第二個參數y的時候,用2-當前的y的豎直參數,計算位置如下:然后將位置以point來存儲在filtersStartPoints中

private void getFiltersStartPoints( int width, int height){

int offsetW = width /24;

int offsetH = height/24;

int size = filters.size();

for(int i = 0; i < size; i ++){

int index = i/9;

int offX = offsetW + index * width + (i % 3) * width/3;

int offY = offsetH + (2-(i % 9)/3) * height/3;

filtersStartPoints.add(new Point(offX,offY));

}

}

offsetW是距離glsurfaceView左邊的距離,offsetW是距離底邊的距離。每個filter的寬高是總的控件寬高的1/4。

繪制filter

確定了每個filter的位置后,只需要利用glViewport來控制繪制的位置,然后將每個filter的texture設置為camera數據離頻渲染的texture,然后就可以將所有filter的濾鏡效果繪制出來:

private ArrayList filters = new ArrayList<>();

public void drawFilters(int textureId, int width, int height){

if(filtersStartPoints.size() < filters.size()){

getFiltersStartPoints( width, height);

}

GLES20.glClearColor(0.0f, 0.0f, 0.0f, 0.0f);

GLES20.glClear(GLES20.GL_COLOR_BUFFER_BIT | GLES20.GL_DEPTH_BUFFER_BIT);

int size = filters.size();

for(int i = 0; i < size; i ++){

LyFilter filter = filters.get(i);

filter.setTextureId(textureId);

GLES20.glViewport(filtersStartPoints.get(i).x, filtersStartPoints.get(i).y ,

width/4, height/4);

filter.drawNoClear();

}

GLES20.glViewport(0,0,width,height);

這樣就可以將多個filter繪制到一個glsurfaceview上,當然在ontouch中實現滑動翻頁,因此,可以最多繪制2頁就夠了,在滑動的時候,我們只需要平移窗口即可。

效果如下:

device-2019-06-13-155722.png

也希望各位老鐵下載,如有收獲還請多多給予鼓勵,謝謝,github地址:LammyOpenglCamera

總結

以上是生活随笔為你收集整理的android 滤镜 原理,android openglse实现滤镜九宫格的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。