android 滤镜 原理,android openglse实现滤镜九宫格
opengl的渲染之前講過很多,包括FBO等常用的技術(可參考我的博客:fbo),今天解決之前的一個小疑問:手機系統(tǒng)相機中,九宮格的濾鏡選擇是如何實現(xiàn)的,今天閑暇就實現(xiàn)起來看看,同時開放出來之前私有的相機項目:LammyOpenglCamera
原理:先利用fbo,將相機數(shù)據(jù)繪制到一個紋理當中,然后將紋理設置到不同的filter,利用 glViewport來確定繪制窗口位置,然后利用不同的filter繪制在一個glsurfaceview不同的位置。
確定濾鏡的位置
過濾格子位置不包含間隔
如圖,假如每個格子代表一個濾鏡的顯示,不包含過濾之間的間隔,為何這樣標記主要是因為 glViewport的參數(shù)坐標是 左下角為圓心的。
為了符合應用的審美習慣,從左上角開始顯示filter,因此,在結算第二個參數(shù)y的時候,用2-當前的y的豎直參數(shù),計算位置如下:然后將位置以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數(shù)據(jù)離頻渲染的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中實現(xiàn)滑動翻頁,因此,可以最多繪制2頁就夠了,在滑動的時候,我們只需要平移窗口即可。
效果如下:
device-2019-06-13-155722.png
也希望各位老鐵下載,如有收獲還請多多給予鼓勵,謝謝,github地址:LammyOpenglCamera
總結
以上是生活随笔為你收集整理的android 滤镜 原理,android openglse实现滤镜九宫格的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 文化馆建筑方案设计原理及方案
- 下一篇: css3制作正方体