├── .gitignore ├── .idea ├── codeStyles │ └── Project.xml ├── gradle.xml ├── misc.xml ├── runConfigurations.xml └── vcs.xml ├── README.md ├── app ├── .gitignore ├── build.gradle ├── proguard-rules.pro └── src │ ├── androidTest │ └── java │ │ └── com │ │ └── yinge │ │ └── opengl │ │ └── ExampleInstrumentedTest.java │ ├── main │ ├── AndroidManifest.xml │ ├── assets │ │ ├── camera │ │ │ ├── base_vertex.glsl │ │ │ ├── gray_fragment.glsl │ │ │ ├── oes_base_fragment.glsl │ │ │ └── oes_base_vertex.glsl │ │ ├── image │ │ │ ├── half_color_fragment.glsl │ │ │ └── half_color_vertex.glsl │ │ ├── shape │ │ │ ├── a.glsl │ │ │ ├── fshader │ │ │ │ ├── fColorFullTriangle.glsl │ │ │ │ ├── fOval.glsl │ │ │ │ ├── fRegularTriangle.glsl │ │ │ │ ├── fSquare.glsl │ │ │ │ └── fTriangle.glsl │ │ │ └── vshader │ │ │ │ ├── vColorFullTriangle.glsl │ │ │ │ ├── vOval.glsl │ │ │ │ ├── vRegularTriangle.glsl │ │ │ │ ├── vSquare.glsl │ │ │ │ └── vTriangle.glsl │ │ ├── texture │ │ │ └── fengj.png │ │ └── transform │ │ │ ├── fcube.glsl │ │ │ └── vcube.glsl │ ├── java │ │ └── com │ │ │ └── yinge │ │ │ └── opengl │ │ │ ├── MainActivity.java │ │ │ ├── OpenGlApplication.java │ │ │ ├── camera │ │ │ ├── CameraActivity.java │ │ │ ├── CameraDrawer.java │ │ │ ├── CameraView.java │ │ │ ├── ICamera.java │ │ │ ├── KitkatCamera.java │ │ │ └── filter │ │ │ │ ├── AbsOesImageFilter.java │ │ │ │ ├── GrayFilter.java │ │ │ │ └── OesFilter.java │ │ │ ├── camerademo │ │ │ ├── CameraDemoActivity.java │ │ │ ├── ImageUtils.java │ │ │ ├── camera │ │ │ │ ├── Camera2Proxy.java │ │ │ │ └── CameraProxy.java │ │ │ ├── glsurfaceview │ │ │ │ ├── Camera2GLSurfaceView.java │ │ │ │ ├── CameraDrawer.java │ │ │ │ ├── CameraGLSurfaceView.java │ │ │ │ ├── GLSurfaceCamera2Activity.java │ │ │ │ ├── GLSurfaceCameraActivity.java │ │ │ │ └── OpenGLUtils.java │ │ │ ├── surfaceview │ │ │ │ ├── Camera2SurfaceView.java │ │ │ │ ├── CameraSurfaceView.java │ │ │ │ ├── SurfaceCamera2Activity.java │ │ │ │ └── SurfaceCameraActivity.java │ │ │ └── textureview │ │ │ │ ├── Camera2TextureView.java │ │ │ │ ├── CameraTextureView.java │ │ │ │ ├── TextureCamera2Activity.java │ │ │ │ └── TextureCameraActivity.java │ │ │ ├── egl │ │ │ ├── EGLHelper.java │ │ │ ├── EGLRender.java │ │ │ └── EGLRenderActivity.java │ │ │ ├── fbo │ │ │ ├── FboActivity.java │ │ │ └── FboRender.java │ │ │ ├── image │ │ │ ├── GLImageRender.java │ │ │ ├── GLImageView.java │ │ │ ├── GLImageViewActivity.java │ │ │ └── filter │ │ │ │ ├── AbsImageFilter.java │ │ │ │ └── ContrastColorFilter.java │ │ │ ├── render │ │ │ ├── ChooseShapeActivity.java │ │ │ ├── GLShapeRender.java │ │ │ ├── GLShapeView.java │ │ │ ├── GLShapeViewActivity.java │ │ │ ├── Oval.java │ │ │ ├── Shape.java │ │ │ ├── Square.java │ │ │ ├── Triangle.java │ │ │ ├── TriangleWithColorFull.java │ │ │ └── TriangleWithRegular.java │ │ │ ├── transform │ │ │ ├── Cube.java │ │ │ ├── TransformActivity.java │ │ │ ├── TransformMatrix.java │ │ │ └── TransformRender.java │ │ │ └── util │ │ │ ├── OpenGlUtils.java │ │ │ ├── PermissionUtils.java │ │ │ └── ScaleTypeMatrix.java │ └── res │ │ ├── drawable-v24 │ │ └── ic_launcher_foreground.xml │ │ ├── drawable-xhdpi │ │ ├── filter_thumb_1977.jpg │ │ ├── filter_thumb_amoro.jpg │ │ ├── filter_thumb_antique.png │ │ ├── filter_thumb_beauty.png │ │ ├── filter_thumb_blackcat.png │ │ ├── filter_thumb_brannan.jpg │ │ ├── filter_thumb_brooklyn.jpg │ │ ├── filter_thumb_calm.png │ │ ├── filter_thumb_cool.png │ │ ├── filter_thumb_crayon.jpg │ │ ├── filter_thumb_earlybird.jpg │ │ ├── filter_thumb_emerald.png │ │ ├── filter_thumb_evergreen.png │ │ ├── filter_thumb_fairytale.png │ │ ├── filter_thumb_freud.jpg │ │ ├── filter_thumb_healthy.png │ │ ├── filter_thumb_hefe.jpg │ │ ├── filter_thumb_hudson.jpg │ │ ├── filter_thumb_inkwell.jpg │ │ ├── filter_thumb_kevin.jpg │ │ ├── filter_thumb_latte.png │ │ ├── filter_thumb_lomo.jpg │ │ ├── filter_thumb_nashville.jpg │ │ ├── filter_thumb_nostalgia.png │ │ ├── filter_thumb_original.png │ │ ├── filter_thumb_piaxr.jpg │ │ ├── filter_thumb_rise.jpg │ │ ├── filter_thumb_romance.png │ │ ├── filter_thumb_sakura.png │ │ ├── filter_thumb_sierra.jpg │ │ ├── filter_thumb_sketch.png │ │ ├── filter_thumb_sunrise.png │ │ ├── filter_thumb_sunset.png │ │ ├── filter_thumb_sutro.jpg │ │ ├── filter_thumb_sweets.png │ │ ├── filter_thumb_tender.png │ │ ├── filter_thumb_toastero.jpg │ │ ├── filter_thumb_valencia.jpg │ │ ├── filter_thumb_walden.jpg │ │ ├── filter_thumb_warm.png │ │ ├── filter_thumb_whitecat.png │ │ ├── filter_thumb_xpro.jpg │ │ ├── ic_camera_beauty.png │ │ ├── ic_camera_beauty_pressed.png │ │ ├── ic_camera_filter.png │ │ ├── icon_camera_normal.png │ │ ├── icon_camera_press.png │ │ ├── icon_close_normal.png │ │ ├── icon_close_pressed.png │ │ ├── icon_take_picture_normal.png │ │ ├── icon_take_picture_pressed.png │ │ ├── icon_video.png │ │ ├── take_filter_confirm_btn_skin_flat.png │ │ ├── take_filter_favorite_btn01_layer00_skin_flat.png │ │ ├── take_filter_favorite_btn01_layer01_skin_flat.png │ │ ├── take_filter_favorite_btn02_skin_flat.png │ │ ├── take_filter_favorite_icon01_skin_flat.png │ │ ├── take_filter_favorite_icon02_skin_flat.png │ │ └── take_filter_random_btn_skin_flat.png │ │ ├── drawable │ │ ├── bg_down_arrow_close.xml │ │ ├── btn_camera_beauty.xml │ │ ├── btn_camera_filter.xml │ │ ├── btn_camera_shutter.xml │ │ ├── click_button_selector.xml │ │ ├── ic_launcher_background.xml │ │ ├── selector_filter_selected.xml │ │ └── selector_switch_camera.xml │ │ ├── layout │ │ ├── activity_camera.xml │ │ ├── activity_camera_demo.xml │ │ ├── activity_egl.xml │ │ ├── activity_fbo.xml │ │ ├── activity_fglview.xml │ │ ├── activity_glsurface_camera.xml │ │ ├── activity_glsurface_camera2.xml │ │ ├── activity_image.xml │ │ ├── activity_list.xml │ │ ├── activity_magic_camera.xml │ │ ├── activity_main.xml │ │ ├── activity_surface_camera.xml │ │ ├── activity_surface_camera2.xml │ │ ├── activity_texture_camera.xml │ │ ├── activity_texture_camera2.xml │ │ ├── activity_tranform.xml │ │ ├── camera_filter_layout.xml │ │ ├── filter_item_layout.xml │ │ ├── item_button.xml │ │ └── item_choose.xml │ │ ├── menu │ │ └── menu_filter.xml │ │ ├── mipmap-anydpi-v26 │ │ ├── ic_launcher.xml │ │ └── ic_launcher_round.xml │ │ ├── mipmap-hdpi │ │ ├── ic_launcher.png │ │ └── ic_launcher_round.png │ │ ├── mipmap-mdpi │ │ ├── ic_launcher.png │ │ └── ic_launcher_round.png │ │ ├── mipmap-xhdpi │ │ ├── ic_launcher.png │ │ └── ic_launcher_round.png │ │ ├── mipmap-xxhdpi │ │ ├── ic_camera_switch.png │ │ ├── ic_close.png │ │ ├── ic_launcher.png │ │ ├── ic_launcher_round.png │ │ ├── icon_button_click.png │ │ └── icon_button_click_down.png │ │ ├── mipmap-xxxhdpi │ │ ├── ic_launcher.png │ │ └── ic_launcher_round.png │ │ ├── values-zh-rCN │ │ └── strings.xml │ │ └── values │ │ ├── colors.xml │ │ ├── dimens.xml │ │ ├── strings.xml │ │ └── styles.xml │ └── test │ └── java │ └── com │ └── yinge │ └── opengl │ └── ExampleUnitTest.java ├── build.gradle ├── gradle.properties ├── gradle └── wrapper │ ├── gradle-wrapper.jar │ └── gradle-wrapper.properties ├── gradlew ├── gradlew.bat ├── openglcamera ├── .gitignore ├── CMakeLists.txt ├── build.gradle ├── proguard-rules.pro └── src │ ├── androidTest │ └── java │ │ └── com │ │ └── yinge │ │ └── opengl │ │ └── camera │ │ └── ExampleInstrumentedTest.java │ ├── main │ ├── AndroidManifest.xml │ ├── assets │ │ └── filter │ │ │ ├── amaro_mask1.jpg │ │ │ ├── amaro_mask2.jpg │ │ │ ├── amaromap.png │ │ │ ├── blackboard1024.png │ │ │ ├── blend1.jpg │ │ │ ├── bluevintage_mask1.jpg │ │ │ ├── brannan_blowout.png │ │ │ ├── brannan_contrast.png │ │ │ ├── brannan_luma.png │ │ │ ├── brannan_process.png │ │ │ ├── brannan_screen.png │ │ │ ├── brooklynCurves1.png │ │ │ ├── brooklynCurves2.png │ │ │ ├── calm_mask1.jpg │ │ │ ├── calm_mask2.jpg │ │ │ ├── earlybirdOverlayMap.png │ │ │ ├── earlybirdblowout.png │ │ │ ├── earlybirdcurves.png │ │ │ ├── earlybirdmap.png │ │ │ ├── earlybirdoverlaymap_new.png │ │ │ ├── edgeburn.png │ │ │ ├── fairy_tale.png │ │ │ ├── filter_map_first.png │ │ │ ├── flower_layer2c.jpg │ │ │ ├── freud_rand.png │ │ │ ├── healthy_mask_1.jpg │ │ │ ├── hefegradientmap.png │ │ │ ├── hefemap.png │ │ │ ├── hefemetal.png │ │ │ ├── hefesoftlight.png │ │ │ ├── hudsonbackground.png │ │ │ ├── hudsonmap.png │ │ │ ├── inkwellmap.png │ │ │ ├── kelvinmap.png │ │ │ ├── line_layer_c.jpg │ │ │ ├── lomomap_new.png │ │ │ ├── lookup_amatorka_02.png │ │ │ ├── lookup_highkey.png │ │ │ ├── n1977blowout.png │ │ │ ├── n1977map.png │ │ │ ├── nashvillemap.png │ │ │ ├── overlaymap.png │ │ │ ├── pixar_curves.png │ │ │ ├── rise_mask1.jpg │ │ │ ├── rise_mask2.jpg │ │ │ ├── risemap.png │ │ │ ├── sierramap.png │ │ │ ├── sierravignette.png │ │ │ ├── softlight.png │ │ │ ├── sutrocurves.png │ │ │ ├── sutroedgeburn.png │ │ │ ├── sutrometal.png │ │ │ ├── toastercolorshift.png │ │ │ ├── toastercurves.png │ │ │ ├── toastermetal.png │ │ │ ├── toasteroverlaymapwarm.png │ │ │ ├── toastersoftlight.png │ │ │ ├── toy_mask1.jpg │ │ │ ├── toy_mask2.jpg │ │ │ ├── toy_mask3.jpg │ │ │ ├── valenciagradientmap.png │ │ │ ├── valenciamap.png │ │ │ ├── vignette_map.png │ │ │ ├── vignettemap_new.png │ │ │ ├── walden_map.png │ │ │ ├── warm_layer1.jpg │ │ │ └── xpromap.png │ ├── java │ │ └── com │ │ │ └── yinge │ │ │ └── opengl │ │ │ └── camera │ │ │ ├── BaseGlSurfaceView.java │ │ │ ├── SavePictureTask.java │ │ │ ├── camera │ │ │ ├── CameraFilterActivity.java │ │ │ ├── CameraGlSurfaceView.java │ │ │ ├── CameraProxy.java │ │ │ ├── ICamera.java │ │ │ ├── MagicBeautyFilter.java │ │ │ └── MagicCameraInputFilter.java │ │ │ ├── filter │ │ │ ├── adapter │ │ │ │ ├── BaseRecycleViewAdapter.java │ │ │ │ └── CameraFilterAdapter.java │ │ │ ├── advanced │ │ │ │ ├── MagicAmaroFilter.java │ │ │ │ ├── MagicAntiqueFilter.java │ │ │ │ ├── MagicBeautyFilter.java │ │ │ │ ├── MagicBlackCatFilter.java │ │ │ │ ├── MagicBrannanFilter.java │ │ │ │ ├── MagicBrooklynFilter.java │ │ │ │ ├── MagicCalmFilter.java │ │ │ │ ├── MagicCoolFilter.java │ │ │ │ ├── MagicCrayonFilter.java │ │ │ │ ├── MagicEarlyBirdFilter.java │ │ │ │ ├── MagicEmeraldFilter.java │ │ │ │ ├── MagicEvergreenFilter.java │ │ │ │ ├── MagicFairytaleFilter.java │ │ │ │ ├── MagicFreudFilter.java │ │ │ │ ├── MagicHealthyFilter.java │ │ │ │ ├── MagicHefeFilter.java │ │ │ │ ├── MagicHudsonFilter.java │ │ │ │ ├── MagicImageAdjustFilter.java │ │ │ │ ├── MagicInkwellFilter.java │ │ │ │ ├── MagicKevinFilter.java │ │ │ │ ├── MagicLatteFilter.java │ │ │ │ ├── MagicLomoFilter.java │ │ │ │ ├── MagicLookupFilter.java │ │ │ │ ├── MagicN1977Filter.java │ │ │ │ ├── MagicNashvilleFilter.java │ │ │ │ ├── MagicNostalgiaFilter.java │ │ │ │ ├── MagicPixarFilter.java │ │ │ │ ├── MagicRiseFilter.java │ │ │ │ ├── MagicRomanceFilter.java │ │ │ │ ├── MagicSakuraFilter.java │ │ │ │ ├── MagicSierraFilter.java │ │ │ │ ├── MagicSketchFilter.java │ │ │ │ ├── MagicSkinWhitenFilter.java │ │ │ │ ├── MagicSunriseFilter.java │ │ │ │ ├── MagicSunsetFilter.java │ │ │ │ ├── MagicSutroFilter.java │ │ │ │ ├── MagicSweetsFilter.java │ │ │ │ ├── MagicTenderFilter.java │ │ │ │ ├── MagicToasterFilter.java │ │ │ │ ├── MagicValenciaFilter.java │ │ │ │ ├── MagicWaldenFilter.java │ │ │ │ ├── MagicWarmFilter.java │ │ │ │ ├── MagicWhiteCatFilter.java │ │ │ │ └── MagicXproIIFilter.java │ │ │ ├── base │ │ │ │ ├── MagicBaseGroupFilter.java │ │ │ │ ├── MagicBilateralFilter.java │ │ │ │ └── gpuimage │ │ │ │ │ ├── GPUImageBrightnessFilter.java │ │ │ │ │ ├── GPUImageContrastFilter.java │ │ │ │ │ ├── GPUImageExposureFilter.java │ │ │ │ │ ├── GPUImageFilter.java │ │ │ │ │ ├── GPUImageHueFilter.java │ │ │ │ │ ├── GPUImageSaturationFilter.java │ │ │ │ │ └── GPUImageSharpenFilter.java │ │ │ └── helper │ │ │ │ ├── FilterAdjuster.java │ │ │ │ ├── FilterFactory.java │ │ │ │ ├── FilterType.java │ │ │ │ ├── FilterTypeHelper.java │ │ │ │ └── GPUPower.java │ │ │ ├── image │ │ │ ├── ImageBeautyUtil.java │ │ │ ├── ImageEditorActivity.java │ │ │ ├── ImageGlSurfaceView.java │ │ │ ├── frags │ │ │ │ ├── BaseEditFragment.java │ │ │ │ ├── ImageAddsFragment.java │ │ │ │ ├── ImageAdjustFragment.java │ │ │ │ ├── ImageBeautyFragment.java │ │ │ │ ├── ImageFilterFragment.java │ │ │ │ └── ImageFrameFragment.java │ │ │ └── widget │ │ │ │ ├── BubbleSeekBar.java │ │ │ │ └── TwoLineSeekBar.java │ │ │ └── util │ │ │ ├── ImageUtil.java │ │ │ ├── OpenGlCameraSdk.java │ │ │ ├── OpenGlUtils.java │ │ │ ├── Rotation.java │ │ │ └── TextureRotationUtil.java │ ├── jni │ │ ├── ImageBeauty.cpp │ │ ├── bitmap │ │ │ ├── BitmapOperation.cpp │ │ │ ├── BitmapOperation.h │ │ │ └── JniBitmap.h │ │ └── com_yinge_opengl_camera_image_ImageBeautyUtil.h │ └── res │ │ ├── drawable-xhdpi │ │ ├── edit_bg_adjust_contrast.png │ │ ├── edit_bg_adjust_contrast_press.png │ │ ├── edit_bg_adjust_exposure.png │ │ ├── edit_bg_adjust_exposure_press.png │ │ ├── edit_bg_adjust_hdr.png │ │ ├── edit_bg_adjust_hdr_press.png │ │ ├── edit_bg_adjust_saturation.png │ │ ├── edit_bg_adjust_saturation_press.png │ │ ├── edit_bg_adjust_sharpness.png │ │ ├── edit_bg_adjust_sharpness_press.png │ │ ├── edit_bg_adjust_vibrance.png │ │ ├── edit_bg_adjust_vibrance_press.png │ │ ├── edit_bg_done.png │ │ ├── edit_bg_done_disenable.png │ │ ├── edit_bg_done_press.png │ │ ├── edit_color_hue.png │ │ ├── edit_color_hue_press.png │ │ ├── i_adds.png │ │ ├── i_adds_blue.png │ │ ├── i_auto_beauty.png │ │ ├── i_auto_beauty_pressed.png │ │ ├── i_cosmesis.png │ │ ├── i_cosmesis_blue.png │ │ ├── i_edit.png │ │ ├── i_edit_blue.png │ │ ├── i_effect.png │ │ ├── i_effect_blue.png │ │ ├── i_frame.png │ │ ├── i_frame_blue.png │ │ ├── i_skinprocess.png │ │ ├── i_skinprocess_pressed.png │ │ ├── ic_collage_layout_filters_bar_close_normal.png │ │ ├── ic_collage_layout_filters_bar_close_pressed.png │ │ ├── ic_seekbar_smallsize_thumb_light_normal.png │ │ ├── ic_seekbar_smallsize_thumb_light_pressed.png │ │ ├── ic_seekbar_thumb_light_normal.png │ │ ├── ic_seekbar_thumb_light_pressed.png │ │ ├── ic_seekbar_thumb_normal.png │ │ ├── ic_seekbar_thumb_pressed.png │ │ ├── mix_gallery_bottom_back_click.png │ │ ├── mix_gallery_bottom_back_normal.png │ │ ├── seekbar_bg.9.png │ │ ├── seekbar_bg_light.9.png │ │ ├── seekbar_primary_progress.9.png │ │ ├── seekbar_transparent_bg.9.png │ │ └── tooltip_bg.9.png │ │ ├── drawable-xxhdpi │ │ ├── filter_thumb_1977.jpg │ │ ├── filter_thumb_amoro.jpg │ │ ├── filter_thumb_antique.png │ │ ├── filter_thumb_beauty.png │ │ ├── filter_thumb_blackcat.png │ │ ├── filter_thumb_brannan.jpg │ │ ├── filter_thumb_brooklyn.jpg │ │ ├── filter_thumb_calm.png │ │ ├── filter_thumb_cool.png │ │ ├── filter_thumb_crayon.jpg │ │ ├── filter_thumb_earlybird.jpg │ │ ├── filter_thumb_emerald.png │ │ ├── filter_thumb_evergreen.png │ │ ├── filter_thumb_fairytale.png │ │ ├── filter_thumb_freud.jpg │ │ ├── filter_thumb_healthy.png │ │ ├── filter_thumb_hefe.jpg │ │ ├── filter_thumb_hudson.jpg │ │ ├── filter_thumb_inkwell.jpg │ │ ├── filter_thumb_kevin.jpg │ │ ├── filter_thumb_latte.png │ │ ├── filter_thumb_lomo.jpg │ │ ├── filter_thumb_nashville.jpg │ │ ├── filter_thumb_nostalgia.png │ │ ├── filter_thumb_original.png │ │ ├── filter_thumb_piaxr.jpg │ │ ├── filter_thumb_rise.jpg │ │ ├── filter_thumb_romance.png │ │ ├── filter_thumb_sakura.png │ │ ├── filter_thumb_sierra.jpg │ │ ├── filter_thumb_sketch.png │ │ ├── filter_thumb_sunrise.png │ │ ├── filter_thumb_sunset.png │ │ ├── filter_thumb_sutro.jpg │ │ ├── filter_thumb_sweets.png │ │ ├── filter_thumb_tender.png │ │ ├── filter_thumb_toastero.jpg │ │ ├── filter_thumb_valencia.jpg │ │ ├── filter_thumb_walden.jpg │ │ ├── filter_thumb_warm.png │ │ ├── filter_thumb_whitecat.png │ │ ├── filter_thumb_xpro.jpg │ │ ├── ic_camera_beauty.png │ │ ├── ic_camera_beauty_pressed.png │ │ ├── ic_camera_filter.png │ │ ├── icon_camera_normal.png │ │ ├── icon_camera_press.png │ │ ├── icon_close_normal.png │ │ ├── icon_close_pressed.png │ │ ├── icon_take_picture_normal.png │ │ ├── icon_take_picture_pressed.png │ │ ├── icon_video.png │ │ ├── take_filter_confirm_btn_skin_flat.png │ │ ├── take_filter_favorite_btn01_layer00_skin_flat.png │ │ ├── take_filter_favorite_btn01_layer01_skin_flat.png │ │ ├── take_filter_favorite_btn02_skin_flat.png │ │ ├── take_filter_favorite_icon01_skin_flat.png │ │ ├── take_filter_favorite_icon02_skin_flat.png │ │ └── take_filter_random_btn_skin_flat.png │ │ ├── drawable │ │ ├── bg_down_arrow_close.xml │ │ ├── btn_camera_beauty.xml │ │ ├── btn_camera_filter.xml │ │ ├── btn_camera_shutter.xml │ │ ├── btn_layout_filters_bar_close.xml │ │ ├── click_button_selector.xml │ │ ├── seekbar_progress.xml │ │ ├── seekbar_progress_light.xml │ │ ├── seekbar_thumb.xml │ │ ├── seekbar_thumb_light.xml │ │ ├── selector_filter_favorite_btn.xml │ │ ├── selector_filter_selected.xml │ │ ├── selector_image_adds.xml │ │ ├── selector_image_back.xml │ │ ├── selector_image_beauty.xml │ │ ├── selector_image_edit.xml │ │ ├── selector_image_edit_adjust_bright.xml │ │ ├── selector_image_edit_adjust_contrast.xml │ │ ├── selector_image_edit_adjust_exposure.xml │ │ ├── selector_image_edit_adjust_hue.xml │ │ ├── selector_image_edit_adjust_saturation.xml │ │ ├── selector_image_edit_adjust_sharpness.xml │ │ ├── selector_image_edit_adjust_vibrance.xml │ │ ├── selector_image_edit_yellow.xml │ │ ├── selector_image_filter.xml │ │ ├── selector_image_fragment_skin.xml │ │ ├── selector_image_frame.xml │ │ ├── selector_image_save.xml │ │ ├── selector_switch_camera.xml │ │ └── take_filter_favorite_btn.xml │ │ ├── layout │ │ ├── activity_image_editor.xml │ │ ├── activity_magic_camera.xml │ │ ├── camera_filter_layout.xml │ │ ├── filter_item_layout.xml │ │ ├── fragment_image_edit_adjust.xml │ │ ├── fragment_image_edit_beauty.xml │ │ └── fragment_image_edit_filter.xml │ │ ├── raw │ │ ├── amaro.glsl │ │ ├── antique.glsl │ │ ├── beauty.glsl │ │ ├── bilateralfilter.glsl │ │ ├── bilateralfilter_low.glsl │ │ ├── blackcat.glsl │ │ ├── brannan.glsl │ │ ├── brooklyn.glsl │ │ ├── calm.glsl │ │ ├── camera_input_fragment.glsl │ │ ├── camera_input_vertex.glsl │ │ ├── camera_photo_beauty_frag.glsl │ │ ├── cool.glsl │ │ ├── crayon.glsl │ │ ├── default_fragment.glsl │ │ ├── default_vertex.glsl │ │ ├── earlybird.glsl │ │ ├── emerald.glsl │ │ ├── evergreen.glsl │ │ ├── freud.glsl │ │ ├── healthy.glsl │ │ ├── hefe.glsl │ │ ├── hudson.glsl │ │ ├── inkwell.glsl │ │ ├── kevin_new.glsl │ │ ├── latte.glsl │ │ ├── lomo.glsl │ │ ├── n1977.glsl │ │ ├── nashville.glsl │ │ ├── nostalgia.glsl │ │ ├── pixar.glsl │ │ ├── rise.glsl │ │ ├── romance.glsl │ │ ├── sakura.glsl │ │ ├── sierra.glsl │ │ ├── sketch.glsl │ │ ├── skinwhiten.glsl │ │ ├── suger_tablets.glsl │ │ ├── sunrise.glsl │ │ ├── sunset.glsl │ │ ├── sutro.glsl │ │ ├── sweets.glsl │ │ ├── tender.glsl │ │ ├── toaster2_filter_shader.glsl │ │ ├── valencia.glsl │ │ ├── walden.glsl │ │ ├── warm.glsl │ │ ├── whitecat.glsl │ │ └── xproii_filter_shader.glsl │ │ └── values │ │ ├── colors.xml │ │ ├── dimens.xml │ │ ├── strings.xml │ │ └── styles.xml │ └── test │ └── java │ └── com │ └── yinge │ └── opengl │ └── camera │ └── ExampleUnitTest.java ├── screenshot ├── Camera+GLSufaceView.png ├── EGL渲染.png ├── fbo使用.png ├── 代码结构1.jpg ├── 代码结构2.jpg ├── 图形变换.png ├── 图片处理.png ├── 滤镜相机.png ├── 相机DEMO.png ├── 绘制形体.png ├── 美颜相机.png └── 首页.png └── settings.gradle /.gitignore: -------------------------------------------------------------------------------- 1 | *.iml 2 | .gradle 3 | /local.properties 4 | /.idea/caches 5 | /.idea/libraries 6 | /.idea/modules.xml 7 | /.idea/workspace.xml 8 | /.idea/navEditor.xml 9 | /.idea/assetWizardSettings.xml 10 | .DS_Store 11 | /build 12 | /captures 13 | .externalNativeBuild 14 | -------------------------------------------------------------------------------- /.idea/gradle.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 19 | 20 | -------------------------------------------------------------------------------- /.idea/misc.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 13 | -------------------------------------------------------------------------------- /.idea/runConfigurations.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 11 | 12 | -------------------------------------------------------------------------------- /.idea/vcs.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | ### 1,AndroidOpenGLES 2 | 学习实践OpenGLES,包括 3 | 1. 绘制几何图形,添加渲染三角形,等腰三角形,彩色等腰三角形,和圆, 4 | 2. 使用OpenGlES 对图片进行模糊,冷暖色调等处理, 5 | 3. 编写glsl着色器语言,基于Camera+GlSurfaceView实现相机实时预览 6 | ,实时美颜,实时预览滤镜功能,以及对相册单张图片进行编辑,美颜,滤镜功能, 7 | 4. 和 脱离GLSurfaceView的Render环境,独立创建EGL上下文环境渲染,FBO帧缓冲对象的使用和离屏渲染 8 | ### 2,代码结构 9 | ||| 10 | |:---:|:---:| 11 | |![](https://github.com/tuke0919/AndroidOpenGLES/blob/master/screenshot/%E4%BB%A3%E7%A0%81%E7%BB%93%E6%9E%841.jpg)|![](https://github.com/tuke0919/AndroidOpenGLES/blob/master/screenshot/%E4%BB%A3%E7%A0%81%E7%BB%93%E6%9E%842.jpg)| 12 | ### 3,代码实例 13 | |||| 14 | |:---:|:---:|:---:| 15 | |![](https://github.com/tuke0919/AndroidOpenGLES/blob/master/screenshot/%E9%A6%96%E9%A1%B5.png)|![](https://github.com/tuke0919/AndroidOpenGLES/blob/master/screenshot/%E6%BB%A4%E9%95%9C%E7%9B%B8%E6%9C%BA.png)|![](https://github.com/tuke0919/AndroidOpenGLES/blob/master/screenshot/%E7%BE%8E%E9%A2%9C%E7%9B%B8%E6%9C%BA.png)| 16 | |![](https://github.com/tuke0919/AndroidOpenGLES/blob/master/screenshot/%E5%9B%BE%E7%89%87%E5%A4%84%E7%90%86.png)|![](https://github.com/tuke0919/AndroidOpenGLES/blob/master/screenshot/%E7%9B%B8%E6%9C%BADEMO.png)|![](https://github.com/tuke0919/AndroidOpenGLES/blob/master/screenshot/EGL%E6%B8%B2%E6%9F%93.png)| 17 | |![](https://github.com/tuke0919/AndroidOpenGLES/blob/master/screenshot/%E7%BB%98%E5%88%B6%E5%BD%A2%E4%BD%93.png)|![](https://github.com/tuke0919/AndroidOpenGLES/blob/master/screenshot/%E5%9B%BE%E5%BD%A2%E5%8F%98%E6%8D%A2.png)|![](https://github.com/tuke0919/AndroidOpenGLES/blob/master/screenshot/fbo%E4%BD%BF%E7%94%A8.png)| 18 | -------------------------------------------------------------------------------- /app/.gitignore: -------------------------------------------------------------------------------- 1 | /build 2 | -------------------------------------------------------------------------------- /app/build.gradle: -------------------------------------------------------------------------------- 1 | apply plugin: 'com.android.application' 2 | 3 | android { 4 | compileSdkVersion 28 5 | defaultConfig { 6 | applicationId "com.yinge.opengl" 7 | minSdkVersion 21 8 | targetSdkVersion 28 9 | versionCode 1 10 | versionName "1.0" 11 | testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner" 12 | } 13 | buildTypes { 14 | release { 15 | minifyEnabled false 16 | proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' 17 | } 18 | } 19 | } 20 | 21 | dependencies { 22 | implementation fileTree(include: ['*.jar'], dir: 'libs') 23 | implementation 'com.android.support:appcompat-v7:28.0.0' 24 | implementation 'com.android.support.constraint:constraint-layout:1.1.3' 25 | testImplementation 'junit:junit:4.12' 26 | androidTestImplementation 'com.android.support.test:runner:1.0.2' 27 | androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2' 28 | implementation 'com.android.support:appcompat-v7:28.0.0' 29 | implementation 'com.android.support:recyclerview-v7:28.0.0' 30 | implementation project(':openglcamera') 31 | } 32 | -------------------------------------------------------------------------------- /app/proguard-rules.pro: -------------------------------------------------------------------------------- 1 | # Add project specific ProGuard rules here. 2 | # You can control the set of applied configuration files using the 3 | # proguardFiles setting in build.gradle. 4 | # 5 | # For more details, see 6 | # http://developer.android.com/guide/developing/tools/proguard.html 7 | 8 | # If your project uses WebView with JS, uncomment the following 9 | # and specify the fully qualified class name to the JavaScript interface 10 | # class: 11 | #-keepclassmembers class fqcn.of.javascript.interface.for.webview { 12 | # public *; 13 | #} 14 | 15 | # Uncomment this to preserve the line number information for 16 | # debugging stack traces. 17 | #-keepattributes SourceFile,LineNumberTable 18 | 19 | # If you keep the line number information, uncomment this to 20 | # hide the original source file name. 21 | #-renamesourcefileattribute SourceFile 22 | -------------------------------------------------------------------------------- /app/src/androidTest/java/com/yinge/opengl/ExampleInstrumentedTest.java: -------------------------------------------------------------------------------- 1 | package com.yinge.opengl; 2 | 3 | import android.content.Context; 4 | import android.support.test.InstrumentationRegistry; 5 | import android.support.test.runner.AndroidJUnit4; 6 | 7 | import org.junit.Test; 8 | import org.junit.runner.RunWith; 9 | 10 | import static org.junit.Assert.*; 11 | 12 | /** 13 | * Instrumented test, which will execute on an Android device. 14 | * 15 | * @see Testing documentation 16 | */ 17 | @RunWith(AndroidJUnit4.class) 18 | public class ExampleInstrumentedTest { 19 | @Test 20 | public void useAppContext() { 21 | // Context of the app under test. 22 | Context appContext = InstrumentationRegistry.getTargetContext(); 23 | 24 | assertEquals("com.yinge.opengl", appContext.getPackageName()); 25 | } 26 | } 27 | -------------------------------------------------------------------------------- /app/src/main/assets/camera/base_vertex.glsl: -------------------------------------------------------------------------------- 1 | // 顶点坐标 2 | attribute vec4 vPosition; 3 | // 顶点对应的纹理坐标 4 | attribute vec2 vCoord; 5 | // 顶点变换矩阵 6 | uniform mat4 vMatrix; 7 | 8 | // 传给片元着色器的 纹理坐标 9 | varying vec2 aTextureCoordinate; 10 | 11 | void main(){ 12 | gl_Position = vMatrix * vPosition; 13 | aTextureCoordinate = vCoord; 14 | } -------------------------------------------------------------------------------- /app/src/main/assets/camera/gray_fragment.glsl: -------------------------------------------------------------------------------- 1 | precision mediump float; 2 | varying vec2 aTextureCoordinate; 3 | uniform sampler2D vTexture; 4 | void main() { 5 | vec4 color = texture2D( vTexture, aTextureCoordinate); 6 | float rgb = color.g; 7 | vec4 c = vec4(rgb,rgb,rgb,color.a); 8 | gl_FragColor = c; 9 | } -------------------------------------------------------------------------------- /app/src/main/assets/camera/oes_base_fragment.glsl: -------------------------------------------------------------------------------- 1 | #extension GL_OES_EGL_image_external : require 2 | precision mediump float; 3 | varying vec2 aTextureCoordinate; 4 | // 外部纹理 采样器 5 | uniform samplerExternalOES vTexture; 6 | void main() { 7 | // 在赋值给gl_FragColor之前,对color进行更改,做到实时滤镜 8 | gl_FragColor = texture2D(vTexture, aTextureCoordinate ); 9 | } -------------------------------------------------------------------------------- /app/src/main/assets/camera/oes_base_vertex.glsl: -------------------------------------------------------------------------------- 1 | // 顶点坐标 2 | attribute vec4 vPosition; 3 | // 顶点对应的纹理坐标 4 | attribute vec2 vCoord; 5 | // 顶点变换矩阵 6 | uniform mat4 vMatrix; 7 | 8 | // 纹理坐标变换矩阵 9 | uniform mat4 vCoordMatrix; 10 | // 传给片元着色器的 纹理坐标 11 | varying vec2 aTextureCoordinate; 12 | 13 | void main(){ 14 | gl_Position = vMatrix * vPosition; 15 | aTextureCoordinate = (vCoordMatrix * vec4(vCoord,0,1)).xy; 16 | } -------------------------------------------------------------------------------- /app/src/main/assets/image/half_color_vertex.glsl: -------------------------------------------------------------------------------- 1 | // 顶点坐标 2 | attribute vec4 vPosition; 3 | // 顶点纹理坐标 4 | attribute vec2 vCoordinate; 5 | // 总变换矩阵 6 | uniform mat4 vMatrix; 7 | 8 | // 传递给片元 的 纹理坐标 9 | varying vec2 aCoordinate; 10 | // 传递给片元 的 顶点坐标 11 | varying vec4 aPos; 12 | // 传递给片元 的 变换后的坐标 13 | varying vec4 gPosition; 14 | 15 | void main() { 16 | gl_Position = vMatrix * vPosition; 17 | 18 | aPos = vPosition; 19 | aCoordinate = vCoordinate; 20 | gPosition = vMatrix * vPosition; 21 | } 22 | -------------------------------------------------------------------------------- /app/src/main/assets/shape/a.glsl: -------------------------------------------------------------------------------- 1 | #version 120 2 | 3 | void main() { 4 | 5 | } 6 | -------------------------------------------------------------------------------- /app/src/main/assets/shape/fshader/fColorFullTriangle.glsl: -------------------------------------------------------------------------------- 1 | precision mediump float; 2 | varying vec4 vColor; 3 | void main() { 4 | gl_FragColor = vColor; 5 | } 6 | -------------------------------------------------------------------------------- /app/src/main/assets/shape/fshader/fOval.glsl: -------------------------------------------------------------------------------- 1 | precision mediump float; 2 | uniform vec4 vColor; 3 | void main() { 4 | gl_FragColor = vColor; 5 | } 6 | -------------------------------------------------------------------------------- /app/src/main/assets/shape/fshader/fRegularTriangle.glsl: -------------------------------------------------------------------------------- 1 | precision mediump float; 2 | uniform vec4 vColor; 3 | void main() { 4 | gl_FragColor = vColor; 5 | } 6 | -------------------------------------------------------------------------------- /app/src/main/assets/shape/fshader/fSquare.glsl: -------------------------------------------------------------------------------- 1 | precision mediump float; 2 | uniform vec4 vColor; 3 | void main() { 4 | gl_FragColor = vColor; 5 | } 6 | -------------------------------------------------------------------------------- /app/src/main/assets/shape/fshader/fTriangle.glsl: -------------------------------------------------------------------------------- 1 | precision mediump float; 2 | uniform vec4 vColor; 3 | void main() { 4 | gl_FragColor = vColor; 5 | } 6 | -------------------------------------------------------------------------------- /app/src/main/assets/shape/vshader/vColorFullTriangle.glsl: -------------------------------------------------------------------------------- 1 | attribute vec4 vPosition; 2 | uniform mat4 vMatrix; 3 | varying vec4 vColor; 4 | attribute vec4 aColor; 5 | void main() { 6 | gl_Position = vMatrix * vPosition; 7 | vColor = aColor; 8 | } 9 | -------------------------------------------------------------------------------- /app/src/main/assets/shape/vshader/vOval.glsl: -------------------------------------------------------------------------------- 1 | attribute vec4 vPosition; 2 | uniform mat4 vMatrix; 3 | void main() { 4 | gl_Position = vMatrix * vPosition; 5 | } 6 | -------------------------------------------------------------------------------- /app/src/main/assets/shape/vshader/vRegularTriangle.glsl: -------------------------------------------------------------------------------- 1 | attribute vec4 vPosition; 2 | uniform mat4 vMatrix; 3 | void main() { 4 | gl_Position = vMatrix * vPosition; 5 | } 6 | -------------------------------------------------------------------------------- /app/src/main/assets/shape/vshader/vSquare.glsl: -------------------------------------------------------------------------------- 1 | attribute vec4 vPosition; 2 | uniform mat4 vMatrix; 3 | void main() { 4 | gl_Position = vMatrix * vPosition; 5 | } 6 | -------------------------------------------------------------------------------- /app/src/main/assets/shape/vshader/vTriangle.glsl: -------------------------------------------------------------------------------- 1 | attribute vec4 vPosition; 2 | void main() { 3 | gl_Position = vPosition; 4 | } 5 | -------------------------------------------------------------------------------- /app/src/main/assets/texture/fengj.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tuke0919/AndroidOpenGLES/7b7573f534de51a1d167bbb9727caa4611e3285d/app/src/main/assets/texture/fengj.png -------------------------------------------------------------------------------- /app/src/main/assets/transform/fcube.glsl: -------------------------------------------------------------------------------- 1 | precision mediump float; 2 | varying vec4 vColor; 3 | void main() { 4 | gl_FragColor = vColor; 5 | } 6 | -------------------------------------------------------------------------------- /app/src/main/assets/transform/vcube.glsl: -------------------------------------------------------------------------------- 1 | // 顶点坐标(物体空间) 2 | attribute vec4 vPosition; 3 | // 总矩阵 4 | uniform mat4 vMatrix; 5 | // 渲染颜色 6 | attribute vec4 aColor; 7 | 8 | // 传递给片元 着色器 9 | varying vec4 vColor; 10 | void main() { 11 | gl_Position = vMatrix * vPosition; 12 | vColor = aColor; 13 | } 14 | -------------------------------------------------------------------------------- /app/src/main/java/com/yinge/opengl/OpenGlApplication.java: -------------------------------------------------------------------------------- 1 | package com.yinge.opengl; 2 | 3 | import android.app.Application; 4 | 5 | import com.yinge.opengl.camera.util.OpenGlCameraSdk; 6 | 7 | /** 8 | * 功能: 9 | *

10 | *

Copyright corp.xxx.com 2018 All right reserved

11 | * 12 | * @author tuke 时间 2019/7/17 13 | * @email tuke@corp.xxx.com 14 | *

15 | * 最后修改人:无 16 | *

17 | */ 18 | public class OpenGlApplication extends Application { 19 | 20 | private static OpenGlApplication app; 21 | @Override 22 | public void onCreate() { 23 | super.onCreate(); 24 | app = this; 25 | OpenGlCameraSdk.getInstance().init(this); 26 | } 27 | 28 | public static OpenGlApplication getInstance() { 29 | return app; 30 | } 31 | 32 | 33 | } 34 | -------------------------------------------------------------------------------- /app/src/main/java/com/yinge/opengl/camera/filter/GrayFilter.java: -------------------------------------------------------------------------------- 1 | package com.yinge.opengl.camera.filter; 2 | 3 | import android.content.Context; 4 | 5 | /** 6 | * 功能:灰色过滤器 7 | *

8 | *

Copyright corp.xxx.com 2018 All right reserved

9 | * 10 | * @author tuke 时间 2019/7/14 11 | * @email tuke@xxx.com 12 | *

13 | * 最后修改人:无 14 | *

15 | */ 16 | public class GrayFilter extends AbsOesImageFilter { 17 | 18 | 19 | public GrayFilter(Context context) { 20 | super(context); 21 | } 22 | 23 | @Override 24 | public String getVertexResPath() { 25 | return "camera/base_vertex.glsl"; 26 | } 27 | 28 | @Override 29 | public String getFragmentResPath() { 30 | return "camera/gray_fragment.glsl"; 31 | } 32 | 33 | @Override 34 | public void initOtherHandle() { 35 | 36 | } 37 | 38 | @Override 39 | public void onSizeChanged(int width, int height) { 40 | 41 | } 42 | 43 | @Override 44 | public void setOtherHandle() { 45 | 46 | } 47 | } 48 | -------------------------------------------------------------------------------- /app/src/main/java/com/yinge/opengl/camera/filter/OesFilter.java: -------------------------------------------------------------------------------- 1 | package com.yinge.opengl.camera.filter; 2 | 3 | import android.content.Context; 4 | import android.opengl.GLES11Ext; 5 | import android.opengl.GLES20; 6 | 7 | import java.util.Arrays; 8 | 9 | /** 10 | * 功能: 11 | *

12 | *

Copyright corp.xxx.com 2018 All right reserved

13 | * 14 | * @author tuke 时间 2019/7/14 15 | * @email tuke@xxx.com 16 | *

17 | * 最后修改人:无 18 | *

19 | */ 20 | public class OesFilter extends AbsOesImageFilter { 21 | 22 | // 纹理坐标变换矩阵引用 23 | private int glCoordMatrixHandle; 24 | // 纹理坐标变换矩阵 - 单位矩阵 25 | private float[] mCoordMatrix= Arrays.copyOf(IDENTITY,16); 26 | 27 | public OesFilter(Context context) { 28 | super(context); 29 | } 30 | 31 | @Override 32 | public String getVertexResPath() { 33 | return "camera/oes_base_vertex.glsl"; 34 | } 35 | 36 | @Override 37 | public String getFragmentResPath() { 38 | return "camera/oes_base_fragment.glsl"; 39 | } 40 | 41 | @Override 42 | public void initOtherHandle() { 43 | glCoordMatrixHandle = GLES20.glGetUniformLocation(mProgram,"vCoordMatrix"); 44 | } 45 | 46 | @Override 47 | public void onSizeChanged(int width, int height) { 48 | 49 | } 50 | 51 | @Override 52 | public void setOtherHandle() { 53 | GLES20.glUniformMatrix4fv(glCoordMatrixHandle,1,false,mCoordMatrix,0); 54 | } 55 | 56 | @Override 57 | protected void onBindTexture() { 58 | GLES20.glActiveTexture(GLES20.GL_TEXTURE0 + getTextureType()); 59 | // 绑定外部纹理id 60 | GLES20.glBindTexture(GLES11Ext.GL_TEXTURE_EXTERNAL_OES, getTextureId()); 61 | GLES20.glUniform1i(glTextureHandle, getTextureType()); 62 | } 63 | } 64 | -------------------------------------------------------------------------------- /app/src/main/java/com/yinge/opengl/image/GLImageView.java: -------------------------------------------------------------------------------- 1 | package com.yinge.opengl.image; 2 | 3 | import android.content.Context; 4 | import android.graphics.BitmapFactory; 5 | import android.opengl.GLSurfaceView; 6 | import android.util.AttributeSet; 7 | 8 | import com.yinge.opengl.image.filter.AbsImageFilter; 9 | 10 | import java.io.IOException; 11 | 12 | /** 13 | * 功能: 14 | *

15 | *

Copyright corp.xxx.com 2018 All right reserved

16 | * 17 | * @author tuke 时间 2019/7/11 18 | * @email tuke@xxx.com 19 | *

20 | * 最后修改人:无 21 | *

22 | */ 23 | public class GLImageView extends GLSurfaceView { 24 | 25 | private GLImageRender mRender; 26 | 27 | public GLImageView(Context context) { 28 | super(context); 29 | init(); 30 | } 31 | 32 | public GLImageView(Context context, AttributeSet attrs) { 33 | super(context, attrs); 34 | init(); 35 | } 36 | 37 | public void init(){ 38 | setEGLContextClientVersion(2); 39 | mRender = new GLImageRender(getContext()); 40 | setRenderer(mRender); 41 | setRenderMode(RENDERMODE_WHEN_DIRTY); 42 | 43 | 44 | try { 45 | mRender.setBitmap(BitmapFactory.decodeStream(getResources().getAssets().open("texture/fengj.png"))); 46 | requestRender(); 47 | } catch (IOException e) { 48 | e.printStackTrace(); 49 | } 50 | } 51 | 52 | public GLImageRender getRender() { 53 | return mRender; 54 | } 55 | 56 | /** 57 | * 设置过滤器 58 | * @param filter 59 | */ 60 | public void setFilter(AbsImageFilter filter) { 61 | mRender.setImageFilter(filter); 62 | 63 | } 64 | 65 | 66 | } 67 | -------------------------------------------------------------------------------- /app/src/main/java/com/yinge/opengl/image/filter/ContrastColorFilter.java: -------------------------------------------------------------------------------- 1 | package com.yinge.opengl.image.filter; 2 | 3 | import android.content.Context; 4 | import android.opengl.GLES20; 5 | 6 | /** 7 | * 功能: 8 | *

9 | *

Copyright corp.xxx.com 2018 All right reserved

10 | * 11 | * @author tuke 时间 2019/7/13 12 | * @email tuke@xxx.com 13 | *

14 | * 最后修改人:无 15 | *

16 | */ 17 | public class ContrastColorFilter extends AbsImageFilter { 18 | 19 | private Filter mFilter; 20 | 21 | private int mChangeTypeHandle; 22 | private int mChangeColorHandle; 23 | 24 | public ContrastColorFilter(Context mContext, Filter filter) { 25 | super(mContext, "image/half_color_vertex.glsl", "image/half_color_fragment.glsl"); 26 | this.mFilter = filter; 27 | 28 | } 29 | 30 | @Override 31 | public void onGetOtherHandle(int mProgram) { 32 | mChangeTypeHandle = GLES20.glGetUniformLocation(mProgram, "vChangeType"); 33 | mChangeColorHandle = GLES20.glGetUniformLocation(mProgram, "vChangeColor"); 34 | } 35 | 36 | @Override 37 | public void onSetOtherHandle() { 38 | GLES20.glUniform1i(mChangeTypeHandle, mFilter.getType()); 39 | GLES20.glUniform3fv(mChangeColorHandle, 1, mFilter.data(), 0); 40 | } 41 | 42 | 43 | public enum Filter{ 44 | 45 | NONE(0,new float[]{0.0f,0.0f,0.0f}), 46 | GRAY(1,new float[]{0.299f,0.587f,0.114f}), 47 | COOL(2,new float[]{0.0f,0.0f,0.1f}), 48 | WARM(2,new float[]{0.1f,0.1f,0.0f}), 49 | BLUR(3,new float[]{0.006f,0.004f,0.002f}), 50 | MAGN(4,new float[]{0.0f,0.0f,0.4f}); 51 | 52 | private int vChangeType; 53 | private float[] data; 54 | 55 | Filter(int vChangeType,float[] data){ 56 | this.vChangeType=vChangeType; 57 | this.data=data; 58 | } 59 | 60 | public int getType(){ 61 | return vChangeType; 62 | } 63 | 64 | public float[] data(){ 65 | return data; 66 | } 67 | 68 | } 69 | } 70 | -------------------------------------------------------------------------------- /app/src/main/java/com/yinge/opengl/render/GLShapeRender.java: -------------------------------------------------------------------------------- 1 | package com.yinge.opengl.render; 2 | 3 | import android.opengl.GLES20; 4 | import android.util.Log; 5 | import android.view.View; 6 | 7 | import java.lang.reflect.Constructor; 8 | 9 | import javax.microedition.khronos.egl.EGLConfig; 10 | import javax.microedition.khronos.opengles.GL10; 11 | 12 | /** 13 | * 功能: 14 | *

15 | *

Copyright corp.xxx.com 2018 All right reserved

16 | * 17 | * @author tuke 时间 2019/7/7 18 | * @email tuke@xxx.com 19 | *

20 | * 最后修改人:无 21 | *

22 | */ 23 | public class GLShapeRender extends Shape { 24 | 25 | protected static final String TAG = GLShapeRender.class.getSimpleName(); 26 | 27 | private Shape shape; 28 | private Class clazz = Triangle.class; 29 | 30 | public GLShapeRender(View view) { 31 | super(view); 32 | } 33 | 34 | @Override 35 | public void onSurfaceCreated(GL10 gl, EGLConfig config) { 36 | GLES20.glClearColor(0.5f,0.5f,0.5f,1.0f); 37 | Log.e(TAG,"onSurfaceCreated"); 38 | 39 | try { 40 | Constructor constructor = clazz.getDeclaredConstructor(View.class); 41 | constructor.setAccessible(true); 42 | shape= (Shape) constructor.newInstance(mView); 43 | 44 | 45 | } catch (Exception e) { 46 | shape=new Triangle(mView); 47 | } 48 | shape.onSurfaceCreated(gl,config); 49 | } 50 | 51 | @Override 52 | public void onSurfaceChanged(GL10 gl, int width, int height) { 53 | Log.e(TAG,"onSurfaceChanged"); 54 | GLES20.glViewport(0,0, width, height); 55 | 56 | shape.onSurfaceChanged(gl, width, height); 57 | } 58 | 59 | @Override 60 | public void onDrawFrame(GL10 gl) { 61 | Log.e(TAG,"onDrawFrame"); 62 | GLES20.glClear(GLES20.GL_COLOR_BUFFER_BIT|GLES20.GL_DEPTH_BUFFER_BIT); 63 | 64 | shape.onDrawFrame(gl); 65 | } 66 | 67 | public void setShape(Class clazz) { 68 | this.clazz = clazz; 69 | } 70 | } 71 | -------------------------------------------------------------------------------- /app/src/main/java/com/yinge/opengl/render/GLShapeView.java: -------------------------------------------------------------------------------- 1 | package com.yinge.opengl.render; 2 | 3 | import android.content.Context; 4 | import android.opengl.GLSurfaceView; 5 | import android.util.AttributeSet; 6 | 7 | /** 8 | * 功能: 9 | *

10 | *

Copyright corp.xxx.com 2018 All right reserved

11 | * 12 | * @author tuke 时间 2019/7/7 13 | * @email tuke@xxx.com 14 | *

15 | * 最后修改人:无 16 | *

17 | */ 18 | public class GLShapeView extends GLSurfaceView { 19 | 20 | private GLShapeRender shapeRender; 21 | 22 | public GLShapeView(Context context) { 23 | super(context); 24 | init(); 25 | } 26 | 27 | public GLShapeView(Context context, AttributeSet attrs) { 28 | super(context, attrs); 29 | init(); 30 | } 31 | 32 | private void init() { 33 | setEGLContextClientVersion(2); 34 | setRenderer(shapeRender = new GLShapeRender(this)); 35 | setRenderMode(GLSurfaceView.RENDERMODE_WHEN_DIRTY); 36 | } 37 | 38 | /** 39 | * 设置形状 40 | * @param clazz 41 | */ 42 | public void setShape(Class clazz) { 43 | 44 | try { 45 | shapeRender.setShape(clazz); 46 | } catch (Exception e) { 47 | e.printStackTrace(); 48 | } 49 | 50 | } 51 | 52 | 53 | 54 | } 55 | -------------------------------------------------------------------------------- /app/src/main/java/com/yinge/opengl/render/GLShapeViewActivity.java: -------------------------------------------------------------------------------- 1 | /* 2 | * 3 | * FGLViewActivity.java 4 | * 5 | * Created by Wuwang on 2016/9/30 6 | */ 7 | package com.yinge.opengl.render; 8 | 9 | import android.content.Intent; 10 | import android.os.Bundle; 11 | import android.support.annotation.Nullable; 12 | import android.support.v7.app.AppCompatActivity; 13 | import android.view.View; 14 | import android.widget.Button; 15 | 16 | import com.yinge.opengl.R; 17 | 18 | 19 | /** 20 | * Description: 21 | */ 22 | public class GLShapeViewActivity extends AppCompatActivity implements View.OnClickListener { 23 | 24 | private static final int REQ_CHOOSE=0x0101; 25 | 26 | private Button mChange; 27 | private GLShapeView mGLView; 28 | 29 | 30 | @Override 31 | protected void onCreate(@Nullable Bundle savedInstanceState) { 32 | super.onCreate(savedInstanceState); 33 | setContentView(R.layout.activity_fglview); 34 | init(); 35 | } 36 | 37 | private void init(){ 38 | mChange= (Button) findViewById(R.id.mChange); 39 | mGLView= (GLShapeView) findViewById(R.id.mGLView); 40 | } 41 | 42 | public void onClick(View view){ 43 | switch (view.getId()){ 44 | case R.id.mChange: 45 | Intent intent=new Intent(this,ChooseShapeActivity.class); 46 | startActivityForResult(intent,REQ_CHOOSE); 47 | break; 48 | } 49 | } 50 | 51 | @Override 52 | protected void onActivityResult(int requestCode, int resultCode, Intent data) { 53 | super.onActivityResult(requestCode, resultCode, data); 54 | if(resultCode==RESULT_OK){ 55 | mGLView.setShape((Class) data.getSerializableExtra("name")); 56 | } 57 | } 58 | 59 | @Override 60 | protected void onResume() { 61 | super.onResume(); 62 | mGLView.onResume(); 63 | } 64 | 65 | @Override 66 | protected void onPause() { 67 | super.onPause(); 68 | mGLView.onPause(); 69 | } 70 | } 71 | -------------------------------------------------------------------------------- /app/src/main/java/com/yinge/opengl/render/Shape.java: -------------------------------------------------------------------------------- 1 | package com.yinge.opengl.render; 2 | 3 | import android.opengl.GLES20; 4 | import android.opengl.GLSurfaceView; 5 | import android.view.View; 6 | 7 | /** 8 | * 功能: 9 | *

10 | *

Copyright corp.xxx.com 2018 All right reserved

11 | * 12 | * @author tuke 时间 2019/7/7 13 | * @email tuke@xxx.com 14 | *

15 | * 最后修改人:无 16 | *

17 | */ 18 | public abstract class Shape implements GLSurfaceView.Renderer { 19 | 20 | protected View mView; 21 | 22 | public Shape(View view) { 23 | this.mView = view; 24 | } 25 | 26 | /** 27 | * 加载,编译着色器 28 | * @param type {@link GLES20#GL_VERTEX_SHADER,GLES20#GL_FRAGMENT_SHADER} 29 | * @param shaderCode 着色器源代码 30 | * @return 31 | */ 32 | public int loadShader(int type, String shaderCode) { 33 | // 根据type创建顶点着色器或者片元着色器 34 | int shader = GLES20.glCreateShader(type); 35 | // 将着色器代码加入着色器 36 | GLES20.glShaderSource(shader, shaderCode); 37 | // 编译着色器 38 | GLES20.glCompileShader(shader); 39 | // 获取着色器的编译状态 40 | int[] compiled = new int[1]; 41 | GLES20.glGetShaderiv(shader, GLES20.GL_COMPILE_STATUS, compiled, 0); 42 | return shader; 43 | 44 | } 45 | 46 | 47 | 48 | } 49 | -------------------------------------------------------------------------------- /app/src/main/java/com/yinge/opengl/transform/TransformActivity.java: -------------------------------------------------------------------------------- 1 | package com.yinge.opengl.transform; 2 | 3 | import android.opengl.GLSurfaceView; 4 | import android.os.Bundle; 5 | import android.support.annotation.Nullable; 6 | import android.support.v7.app.AppCompatActivity; 7 | 8 | import com.yinge.opengl.R; 9 | 10 | 11 | /** 12 | * 矩阵变化 demo 13 | */ 14 | 15 | public class TransformActivity extends AppCompatActivity { 16 | 17 | private GLSurfaceView mGLView; 18 | private TransformRender render; 19 | 20 | @Override 21 | protected void onCreate(@Nullable Bundle savedInstanceState) { 22 | super.onCreate(savedInstanceState); 23 | setContentView(R.layout.activity_tranform); 24 | initGL(); 25 | } 26 | 27 | public void initGL(){ 28 | mGLView= (GLSurfaceView) findViewById(R.id.mGLView); 29 | mGLView.setEGLContextClientVersion(2); 30 | render = new TransformRender(this); 31 | mGLView.setRenderer(render); 32 | mGLView.setRenderMode(GLSurfaceView.RENDERMODE_WHEN_DIRTY); 33 | } 34 | 35 | } 36 | -------------------------------------------------------------------------------- /app/src/main/java/com/yinge/opengl/util/PermissionUtils.java: -------------------------------------------------------------------------------- 1 | /* 2 | * 3 | * PermissionUtils.java 4 | * 5 | * Created by Wuwang on 2016/11/14 6 | * Copyright © 2016年 深圳哎吖科技. All rights reserved. 7 | */ 8 | package com.yinge.opengl.util; 9 | 10 | import android.Manifest; 11 | import android.app.Activity; 12 | import android.content.pm.PackageManager; 13 | import android.os.Build; 14 | import android.support.v4.app.ActivityCompat; 15 | 16 | /** 17 | * Description: 18 | */ 19 | public class PermissionUtils { 20 | 21 | 22 | public static void askPermission(Activity context, String[] permissions, int req, Runnable 23 | runnable){ 24 | if(Build.VERSION.SDK_INT>= Build.VERSION_CODES.M){ 25 | int result= ActivityCompat.checkSelfPermission(context,permissions[0]); 26 | if(result== PackageManager.PERMISSION_GRANTED){ 27 | runnable.run(); 28 | }else{ 29 | ActivityCompat.requestPermissions(context,new String[]{Manifest.permission.CAMERA 30 | , Manifest.permission.WRITE_EXTERNAL_STORAGE},req); 31 | } 32 | }else{ 33 | runnable.run(); 34 | } 35 | } 36 | 37 | public static void onRequestPermissionsResult(boolean isReq, int[] grantResults, Runnable 38 | okRun, Runnable deniRun){ 39 | if(isReq){ 40 | if (grantResults.length > 0&&grantResults[0]== PackageManager.PERMISSION_GRANTED) { 41 | okRun.run(); 42 | } else { 43 | deniRun.run(); 44 | } 45 | } 46 | } 47 | 48 | } 49 | -------------------------------------------------------------------------------- /app/src/main/java/com/yinge/opengl/util/ScaleTypeMatrix.java: -------------------------------------------------------------------------------- 1 | package com.yinge.opengl.util; 2 | 3 | import android.opengl.Matrix; 4 | 5 | /** 6 | * 功能: 7 | *

8 | *

Copyright corp.xxx.com 2018 All right reserved

9 | * 10 | * @author tuke 时间 2019/7/14 11 | * @email tuke@xxx.com 12 | *

13 | * 最后修改人:无 14 | *

15 | */ 16 | public class ScaleTypeMatrix { 17 | 18 | 19 | /** 20 | * @return 单位矩阵 21 | */ 22 | public static float[] getIdentityMatrix(){ 23 | return new float[]{ 24 | 1,0,0,0, 25 | 0,1,0,0, 26 | 0,0,1,0, 27 | 0,0,0,1 28 | }; 29 | } 30 | 31 | /** 32 | * 计算 mvp矩阵 33 | * @param mvpMatrix 最终mvp矩阵 34 | * @param imageWidth 图像宽 35 | * @param imageHeight 图像高 36 | * @param viewWidth 视图宽 37 | * @param viewHeight 视图高 38 | */ 39 | public static void getMVPMatrix(float[] mvpMatrix,int imageWidth,int imageHeight,int viewWidth,int viewHeight){ 40 | 41 | if(imageHeight > 0&& imageWidth >0 && viewWidth > 0 && viewHeight > 0){ 42 | 43 | float viewRatio = (float)viewWidth / viewHeight; 44 | float imageRatio = (float)imageWidth / imageHeight; 45 | float[] projectionMatrix = new float[16]; 46 | float[] cameraMatrix = new float[16]; 47 | // 设置投影矩阵 48 | if(imageRatio > viewRatio){ 49 | Matrix.orthoM(projectionMatrix,0,- viewRatio/imageRatio,viewRatio/imageRatio,-1,1,1,3); 50 | }else{ 51 | Matrix.orthoM(projectionMatrix,0,-1,1,-imageRatio / viewRatio,imageRatio / viewRatio,1,3); 52 | } 53 | // 设置相机矩阵 54 | Matrix.setLookAtM(cameraMatrix,0,0,0,1,0,0,0,0,1,0); 55 | // 计算mvp矩阵 56 | Matrix.multiplyMM(mvpMatrix,0,projectionMatrix,0,cameraMatrix,0); 57 | } 58 | } 59 | } 60 | -------------------------------------------------------------------------------- /app/src/main/res/drawable-v24/ic_launcher_foreground.xml: -------------------------------------------------------------------------------- 1 | 7 | 12 | 13 | 19 | 22 | 25 | 26 | 27 | 28 | 34 | 35 | -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/filter_thumb_1977.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tuke0919/AndroidOpenGLES/7b7573f534de51a1d167bbb9727caa4611e3285d/app/src/main/res/drawable-xhdpi/filter_thumb_1977.jpg -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/filter_thumb_amoro.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tuke0919/AndroidOpenGLES/7b7573f534de51a1d167bbb9727caa4611e3285d/app/src/main/res/drawable-xhdpi/filter_thumb_amoro.jpg -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/filter_thumb_antique.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tuke0919/AndroidOpenGLES/7b7573f534de51a1d167bbb9727caa4611e3285d/app/src/main/res/drawable-xhdpi/filter_thumb_antique.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/filter_thumb_beauty.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tuke0919/AndroidOpenGLES/7b7573f534de51a1d167bbb9727caa4611e3285d/app/src/main/res/drawable-xhdpi/filter_thumb_beauty.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/filter_thumb_blackcat.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tuke0919/AndroidOpenGLES/7b7573f534de51a1d167bbb9727caa4611e3285d/app/src/main/res/drawable-xhdpi/filter_thumb_blackcat.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/filter_thumb_brannan.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tuke0919/AndroidOpenGLES/7b7573f534de51a1d167bbb9727caa4611e3285d/app/src/main/res/drawable-xhdpi/filter_thumb_brannan.jpg -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/filter_thumb_brooklyn.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tuke0919/AndroidOpenGLES/7b7573f534de51a1d167bbb9727caa4611e3285d/app/src/main/res/drawable-xhdpi/filter_thumb_brooklyn.jpg -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/filter_thumb_calm.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tuke0919/AndroidOpenGLES/7b7573f534de51a1d167bbb9727caa4611e3285d/app/src/main/res/drawable-xhdpi/filter_thumb_calm.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/filter_thumb_cool.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tuke0919/AndroidOpenGLES/7b7573f534de51a1d167bbb9727caa4611e3285d/app/src/main/res/drawable-xhdpi/filter_thumb_cool.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/filter_thumb_crayon.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tuke0919/AndroidOpenGLES/7b7573f534de51a1d167bbb9727caa4611e3285d/app/src/main/res/drawable-xhdpi/filter_thumb_crayon.jpg -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/filter_thumb_earlybird.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tuke0919/AndroidOpenGLES/7b7573f534de51a1d167bbb9727caa4611e3285d/app/src/main/res/drawable-xhdpi/filter_thumb_earlybird.jpg -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/filter_thumb_emerald.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tuke0919/AndroidOpenGLES/7b7573f534de51a1d167bbb9727caa4611e3285d/app/src/main/res/drawable-xhdpi/filter_thumb_emerald.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/filter_thumb_evergreen.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tuke0919/AndroidOpenGLES/7b7573f534de51a1d167bbb9727caa4611e3285d/app/src/main/res/drawable-xhdpi/filter_thumb_evergreen.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/filter_thumb_fairytale.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tuke0919/AndroidOpenGLES/7b7573f534de51a1d167bbb9727caa4611e3285d/app/src/main/res/drawable-xhdpi/filter_thumb_fairytale.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/filter_thumb_freud.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tuke0919/AndroidOpenGLES/7b7573f534de51a1d167bbb9727caa4611e3285d/app/src/main/res/drawable-xhdpi/filter_thumb_freud.jpg -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/filter_thumb_healthy.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tuke0919/AndroidOpenGLES/7b7573f534de51a1d167bbb9727caa4611e3285d/app/src/main/res/drawable-xhdpi/filter_thumb_healthy.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/filter_thumb_hefe.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tuke0919/AndroidOpenGLES/7b7573f534de51a1d167bbb9727caa4611e3285d/app/src/main/res/drawable-xhdpi/filter_thumb_hefe.jpg -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/filter_thumb_hudson.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tuke0919/AndroidOpenGLES/7b7573f534de51a1d167bbb9727caa4611e3285d/app/src/main/res/drawable-xhdpi/filter_thumb_hudson.jpg -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/filter_thumb_inkwell.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tuke0919/AndroidOpenGLES/7b7573f534de51a1d167bbb9727caa4611e3285d/app/src/main/res/drawable-xhdpi/filter_thumb_inkwell.jpg -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/filter_thumb_kevin.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tuke0919/AndroidOpenGLES/7b7573f534de51a1d167bbb9727caa4611e3285d/app/src/main/res/drawable-xhdpi/filter_thumb_kevin.jpg -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/filter_thumb_latte.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tuke0919/AndroidOpenGLES/7b7573f534de51a1d167bbb9727caa4611e3285d/app/src/main/res/drawable-xhdpi/filter_thumb_latte.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/filter_thumb_lomo.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tuke0919/AndroidOpenGLES/7b7573f534de51a1d167bbb9727caa4611e3285d/app/src/main/res/drawable-xhdpi/filter_thumb_lomo.jpg -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/filter_thumb_nashville.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tuke0919/AndroidOpenGLES/7b7573f534de51a1d167bbb9727caa4611e3285d/app/src/main/res/drawable-xhdpi/filter_thumb_nashville.jpg -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/filter_thumb_nostalgia.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tuke0919/AndroidOpenGLES/7b7573f534de51a1d167bbb9727caa4611e3285d/app/src/main/res/drawable-xhdpi/filter_thumb_nostalgia.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/filter_thumb_original.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tuke0919/AndroidOpenGLES/7b7573f534de51a1d167bbb9727caa4611e3285d/app/src/main/res/drawable-xhdpi/filter_thumb_original.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/filter_thumb_piaxr.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tuke0919/AndroidOpenGLES/7b7573f534de51a1d167bbb9727caa4611e3285d/app/src/main/res/drawable-xhdpi/filter_thumb_piaxr.jpg -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/filter_thumb_rise.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tuke0919/AndroidOpenGLES/7b7573f534de51a1d167bbb9727caa4611e3285d/app/src/main/res/drawable-xhdpi/filter_thumb_rise.jpg -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/filter_thumb_romance.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tuke0919/AndroidOpenGLES/7b7573f534de51a1d167bbb9727caa4611e3285d/app/src/main/res/drawable-xhdpi/filter_thumb_romance.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/filter_thumb_sakura.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tuke0919/AndroidOpenGLES/7b7573f534de51a1d167bbb9727caa4611e3285d/app/src/main/res/drawable-xhdpi/filter_thumb_sakura.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/filter_thumb_sierra.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tuke0919/AndroidOpenGLES/7b7573f534de51a1d167bbb9727caa4611e3285d/app/src/main/res/drawable-xhdpi/filter_thumb_sierra.jpg -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/filter_thumb_sketch.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tuke0919/AndroidOpenGLES/7b7573f534de51a1d167bbb9727caa4611e3285d/app/src/main/res/drawable-xhdpi/filter_thumb_sketch.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/filter_thumb_sunrise.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tuke0919/AndroidOpenGLES/7b7573f534de51a1d167bbb9727caa4611e3285d/app/src/main/res/drawable-xhdpi/filter_thumb_sunrise.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/filter_thumb_sunset.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tuke0919/AndroidOpenGLES/7b7573f534de51a1d167bbb9727caa4611e3285d/app/src/main/res/drawable-xhdpi/filter_thumb_sunset.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/filter_thumb_sutro.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tuke0919/AndroidOpenGLES/7b7573f534de51a1d167bbb9727caa4611e3285d/app/src/main/res/drawable-xhdpi/filter_thumb_sutro.jpg -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/filter_thumb_sweets.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tuke0919/AndroidOpenGLES/7b7573f534de51a1d167bbb9727caa4611e3285d/app/src/main/res/drawable-xhdpi/filter_thumb_sweets.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/filter_thumb_tender.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tuke0919/AndroidOpenGLES/7b7573f534de51a1d167bbb9727caa4611e3285d/app/src/main/res/drawable-xhdpi/filter_thumb_tender.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/filter_thumb_toastero.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tuke0919/AndroidOpenGLES/7b7573f534de51a1d167bbb9727caa4611e3285d/app/src/main/res/drawable-xhdpi/filter_thumb_toastero.jpg -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/filter_thumb_valencia.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tuke0919/AndroidOpenGLES/7b7573f534de51a1d167bbb9727caa4611e3285d/app/src/main/res/drawable-xhdpi/filter_thumb_valencia.jpg -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/filter_thumb_walden.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tuke0919/AndroidOpenGLES/7b7573f534de51a1d167bbb9727caa4611e3285d/app/src/main/res/drawable-xhdpi/filter_thumb_walden.jpg -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/filter_thumb_warm.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tuke0919/AndroidOpenGLES/7b7573f534de51a1d167bbb9727caa4611e3285d/app/src/main/res/drawable-xhdpi/filter_thumb_warm.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/filter_thumb_whitecat.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tuke0919/AndroidOpenGLES/7b7573f534de51a1d167bbb9727caa4611e3285d/app/src/main/res/drawable-xhdpi/filter_thumb_whitecat.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/filter_thumb_xpro.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tuke0919/AndroidOpenGLES/7b7573f534de51a1d167bbb9727caa4611e3285d/app/src/main/res/drawable-xhdpi/filter_thumb_xpro.jpg -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/ic_camera_beauty.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tuke0919/AndroidOpenGLES/7b7573f534de51a1d167bbb9727caa4611e3285d/app/src/main/res/drawable-xhdpi/ic_camera_beauty.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/ic_camera_beauty_pressed.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tuke0919/AndroidOpenGLES/7b7573f534de51a1d167bbb9727caa4611e3285d/app/src/main/res/drawable-xhdpi/ic_camera_beauty_pressed.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/ic_camera_filter.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tuke0919/AndroidOpenGLES/7b7573f534de51a1d167bbb9727caa4611e3285d/app/src/main/res/drawable-xhdpi/ic_camera_filter.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/icon_camera_normal.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tuke0919/AndroidOpenGLES/7b7573f534de51a1d167bbb9727caa4611e3285d/app/src/main/res/drawable-xhdpi/icon_camera_normal.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/icon_camera_press.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tuke0919/AndroidOpenGLES/7b7573f534de51a1d167bbb9727caa4611e3285d/app/src/main/res/drawable-xhdpi/icon_camera_press.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/icon_close_normal.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tuke0919/AndroidOpenGLES/7b7573f534de51a1d167bbb9727caa4611e3285d/app/src/main/res/drawable-xhdpi/icon_close_normal.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/icon_close_pressed.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tuke0919/AndroidOpenGLES/7b7573f534de51a1d167bbb9727caa4611e3285d/app/src/main/res/drawable-xhdpi/icon_close_pressed.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/icon_take_picture_normal.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tuke0919/AndroidOpenGLES/7b7573f534de51a1d167bbb9727caa4611e3285d/app/src/main/res/drawable-xhdpi/icon_take_picture_normal.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/icon_take_picture_pressed.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tuke0919/AndroidOpenGLES/7b7573f534de51a1d167bbb9727caa4611e3285d/app/src/main/res/drawable-xhdpi/icon_take_picture_pressed.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/icon_video.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tuke0919/AndroidOpenGLES/7b7573f534de51a1d167bbb9727caa4611e3285d/app/src/main/res/drawable-xhdpi/icon_video.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/take_filter_confirm_btn_skin_flat.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tuke0919/AndroidOpenGLES/7b7573f534de51a1d167bbb9727caa4611e3285d/app/src/main/res/drawable-xhdpi/take_filter_confirm_btn_skin_flat.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/take_filter_favorite_btn01_layer00_skin_flat.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tuke0919/AndroidOpenGLES/7b7573f534de51a1d167bbb9727caa4611e3285d/app/src/main/res/drawable-xhdpi/take_filter_favorite_btn01_layer00_skin_flat.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/take_filter_favorite_btn01_layer01_skin_flat.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tuke0919/AndroidOpenGLES/7b7573f534de51a1d167bbb9727caa4611e3285d/app/src/main/res/drawable-xhdpi/take_filter_favorite_btn01_layer01_skin_flat.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/take_filter_favorite_btn02_skin_flat.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tuke0919/AndroidOpenGLES/7b7573f534de51a1d167bbb9727caa4611e3285d/app/src/main/res/drawable-xhdpi/take_filter_favorite_btn02_skin_flat.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/take_filter_favorite_icon01_skin_flat.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tuke0919/AndroidOpenGLES/7b7573f534de51a1d167bbb9727caa4611e3285d/app/src/main/res/drawable-xhdpi/take_filter_favorite_icon01_skin_flat.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/take_filter_favorite_icon02_skin_flat.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tuke0919/AndroidOpenGLES/7b7573f534de51a1d167bbb9727caa4611e3285d/app/src/main/res/drawable-xhdpi/take_filter_favorite_icon02_skin_flat.png -------------------------------------------------------------------------------- /app/src/main/res/drawable-xhdpi/take_filter_random_btn_skin_flat.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/tuke0919/AndroidOpenGLES/7b7573f534de51a1d167bbb9727caa4611e3285d/app/src/main/res/drawable-xhdpi/take_filter_random_btn_skin_flat.png -------------------------------------------------------------------------------- /app/src/main/res/drawable/bg_down_arrow_close.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/btn_camera_beauty.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/btn_camera_filter.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/btn_camera_shutter.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/click_button_selector.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/selector_filter_selected.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 6 | -------------------------------------------------------------------------------- /app/src/main/res/drawable/selector_switch_camera.xml: -------------------------------------------------------------------------------- 1 | 2 | 4 | 5 | 6 | 7 | -------------------------------------------------------------------------------- /app/src/main/res/layout/activity_camera.xml: -------------------------------------------------------------------------------- 1 | 2 | 6 | 7 | 11 | -------------------------------------------------------------------------------- /app/src/main/res/layout/activity_egl.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 8 | 13 | 14 |