├── .gitignore ├── README.md ├── app ├── .gitignore ├── build.gradle ├── proguard-rules.pro └── src │ ├── main │ ├── AndroidManifest.xml │ ├── java │ │ └── com │ │ │ └── onzhou │ │ │ └── opengles │ │ │ ├── main │ │ │ └── SampleApplication.java │ │ │ └── sample │ │ │ └── SampleActivity.java │ └── res │ │ ├── layout │ │ └── activity_opengles_sample.xml │ │ └── values │ │ ├── strings.xml │ │ └── styles.xml │ └── test │ └── java │ └── com │ └── onzhou │ └── opengles │ └── sample │ └── ExampleUnitTest.java ├── build.gradle ├── common-base ├── .gitignore ├── build.gradle ├── proguard-rules.pro └── src │ ├── main │ ├── AndroidManifest.xml │ ├── java │ │ └── com │ │ │ └── onzhou │ │ │ └── opengles │ │ │ ├── base │ │ │ ├── AbsBaseActivity.java │ │ │ ├── AbsGLSurfaceActivity.java │ │ │ └── BaseApplication.java │ │ │ ├── core │ │ │ └── AppCore.java │ │ │ ├── task │ │ │ └── AssertReleaseTask.java │ │ │ └── utils │ │ │ ├── LogUtils.java │ │ │ ├── ResReadUtils.java │ │ │ ├── ShaderUtils.java │ │ │ └── TextureUtils.java │ └── res │ │ ├── drawable-v24 │ │ └── ic_launcher_foreground.xml │ │ ├── drawable-xxhdpi │ │ └── main.jpg │ │ ├── drawable │ │ └── ic_launcher_background.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_launcher.png │ │ └── ic_launcher_round.png │ │ ├── mipmap-xxxhdpi │ │ ├── ic_launcher.png │ │ └── ic_launcher_round.png │ │ └── values │ │ ├── colors.xml │ │ ├── strings.xml │ │ └── styles.xml │ └── test │ └── java │ └── com │ └── onzhou │ └── opengles │ └── ExampleUnitTest.java ├── config.gradle ├── gradle.properties ├── gradle └── wrapper │ ├── gradle-wrapper.jar │ └── gradle-wrapper.properties ├── gradlew ├── gradlew.bat ├── module.gradle ├── readme ├── android平台下OpenGL ES 3.0给图片添加黑白滤镜.md ├── android平台下OpenGLES3.0从矩形中看矩阵和正交投影.md ├── android平台下OpenGLES3.0从零开始.md ├── android平台下OpenGLES3.0使用GLSurfaceView对相机Camera预览实时处理.md ├── android平台下OpenGLES3.0使用TextureView对相机Camera预览实时处理.md ├── android平台下OpenGLES3.0实例详解顶点属性、顶点数组.md ├── android平台下OpenGLES3.0实例详解顶点缓冲区对象(VBO)和顶点数组对象(VAO).md ├── android平台下OpenGLES3.0实现2D纹理贴图显示bitmap.md ├── android平台下OpenGLES3.0着色语言基础知识上.md ├── android平台下OpenGLES3.0着色语言基础知识下.md ├── android平台下OpenGLES3.0绘制圆点、直线和三角形.md ├── android平台下OpenGLES3.0绘制彩色三角形.md ├── android平台下OpenGLES3.0绘制立方体的几种方式.md ├── android平台下OpenGLES3.0绘制纯色背景.md ├── android平台下基于ANativeWindow实现渲染bitmap对像.md └── images │ ├── 20181104142344498.png │ ├── 20181104144052178.png │ ├── 20181104145208118.png │ ├── 20181104151331670.png │ ├── 20181104151943322.png │ ├── 20181104152722938.png │ ├── 20181104164419781.png │ ├── 20181104165427818.png │ ├── 2018110420590915.png │ ├── 20181104212813161.png │ ├── 20181104215322927.png │ ├── 20181104215339364.png │ ├── 20181104221645167.png │ ├── 20181104223035672.png │ ├── 20181105121623778.png │ ├── 20181106000828349.png │ ├── 20181106000835992.png │ ├── 20181106110857961.png │ ├── 20181106110905679.png │ ├── 20181106111558844.png │ ├── 20181106115350397.png │ ├── 20181106115420645.png │ ├── 20181108124632149.png │ ├── 20181108124712983.png │ ├── 2018110812474381.png │ ├── 20181108125551557.png │ ├── 20181108145715297.png │ ├── 20181109133849605.png │ ├── 20181109133909448.png │ ├── 20181109133926509.png │ ├── 20181109171605263.png │ ├── 20181110164009917.png │ ├── 2018111016442284.png │ ├── 20181110165328638.png │ ├── 20181110172117581.png │ ├── 20181110174836154.png │ ├── 20181110175440780.png │ ├── 20181110175449693.png │ ├── 20181110183239249.png │ ├── 20181110183646999.png │ ├── 20181111110630635.png │ ├── 20181111130839622.png │ ├── 20181111131217947.png │ ├── 20181111132530649.png │ ├── 20181111132543694.png │ ├── 20181111133402205.png │ ├── 20181111140010643.png │ ├── 20181112222945107.png │ ├── 20181113134235686.png │ ├── 20181113134654161.png │ ├── 201811131505362001.png │ ├── 201811131506362001.png │ ├── 201811131506362002.png │ ├── 201811131506362003.png │ ├── 201811131506362004.png │ ├── 201811131506362005.png │ ├── 201811131506362006.png │ ├── 201811131506362007.png │ ├── 201811131506362008.png │ ├── 201811131506362009.png │ ├── 201811131506362010.png │ ├── 201811131506362011.png │ ├── 201811131506362012.png │ ├── 201811131545252001.png │ ├── 201811131545252002.png │ ├── 201811131545252003.png │ ├── 201811131545252004.png │ ├── device-2019-03-28-095109.png │ ├── device-2019-03-28-095128.png │ └── device-2019-03-28-095140.png ├── sample-basis ├── .gitignore ├── CMakeLists.txt ├── build.gradle ├── gradle.properties ├── proguard-rules.pro └── src │ ├── main │ ├── cpp │ │ ├── native_simple.cpp │ │ └── native_simple.h │ ├── debug │ │ └── AndroidManifest.xml │ ├── java │ │ └── com │ │ │ └── onzhou │ │ │ └── opengles │ │ │ ├── main │ │ │ └── SimpleActivity.java │ │ │ └── simple │ │ │ ├── ColorCubeRenderer.java │ │ │ ├── EnableVertexRenderer.java │ │ │ ├── IndicesCubeRenderer.java │ │ │ ├── LineCubeRenderer.java │ │ │ ├── MapBufferRenderer.java │ │ │ ├── NativeSimpleRenderer.java │ │ │ ├── RectangleRenderer.java │ │ │ ├── RectangleWRenderer.java │ │ │ ├── SimpleRenderer.java │ │ │ ├── UniformRenderer.java │ │ │ ├── VertexArrayRenderer.java │ │ │ ├── VertexBufferRenderer.java │ │ │ └── VertexPointerRenderer.java │ ├── release │ │ └── AndroidManifest.xml │ └── res │ │ ├── layout │ │ └── activity_triangle.xml │ │ ├── raw │ │ ├── fragment_array_shader.glsl │ │ ├── fragment_buffer_shader.glsl │ │ ├── fragment_colorcube_shader.glsl │ │ ├── fragment_enable_shader.glsl │ │ ├── fragment_linecube_shader.glsl │ │ ├── fragment_map_buffer_shader.glsl │ │ ├── fragment_pointer_shader.glsl │ │ ├── fragment_uniform_shader.glsl │ │ ├── fragment_w_shader.glsl │ │ ├── triangle_fragment_shader.glsl │ │ ├── triangle_vertex_shader.glsl │ │ ├── vertex_array_shader.glsl │ │ ├── vertex_buffer_shader.glsl │ │ ├── vertex_colorcube_shader.glsl │ │ ├── vertex_enable_shader.glsl │ │ ├── vertex_linecube_shader.glsl │ │ ├── vertex_map_buffer_shader.glsl │ │ ├── vertex_pointer_shader.glsl │ │ ├── vertex_uniform_shader.glsl │ │ └── vertex_w_shader.glsl │ │ └── values │ │ └── strings.xml │ └── test │ └── java │ └── com │ └── onzhou │ └── opengles │ └── shader │ └── ExampleUnitTest.java ├── sample-camera ├── .gitignore ├── build.gradle ├── gradle.properties ├── proguard-rules.pro └── src │ ├── main │ ├── debug │ │ └── AndroidManifest.xml │ ├── java │ │ └── com │ │ │ └── onzhou │ │ │ └── opengles │ │ │ ├── api │ │ │ ├── ICamera.java │ │ │ └── ITextureRenderer.java │ │ │ ├── camera │ │ │ ├── CameraV1.java │ │ │ ├── CameraV1Pick.java │ │ │ └── TextureEGLHelper.java │ │ │ ├── main │ │ │ ├── CameraSurfaceActivity.java │ │ │ └── CameraTextureActivity.java │ │ │ └── renderer │ │ │ ├── CameraSurfaceRenderer.java │ │ │ └── CameraTextureRenderer.java │ ├── release │ │ └── AndroidManifest.xml │ └── res │ │ ├── raw │ │ ├── fragment_camera_shader.glsl │ │ ├── fragment_texture_shader.glsl │ │ ├── vertex_camera_shader.glsl │ │ └── vertex_texture_shader.glsl │ │ └── values │ │ └── strings.xml │ └── test │ └── java │ └── com │ └── onzhou │ └── opengles │ └── camera │ └── ExampleUnitTest.java ├── sample-color ├── .gitignore ├── CMakeLists.txt ├── build.gradle ├── gradle.properties ├── proguard-rules.pro └── src │ ├── main │ ├── cpp │ │ ├── native_color.cpp │ │ └── native_color.h │ ├── debug │ │ └── AndroidManifest.xml │ ├── java │ │ └── com │ │ │ └── onzhou │ │ │ └── opengles │ │ │ ├── color │ │ │ ├── ColorRenderer.java │ │ │ └── NativeColorRenderer.java │ │ │ └── main │ │ │ └── ColorActivity.java │ ├── release │ │ └── AndroidManifest.xml │ └── res │ │ ├── raw │ │ ├── triangle_fragment_shader.glsl │ │ └── triangle_vertex_shader.glsl │ │ └── values │ │ └── strings.xml │ └── test │ └── java │ └── com │ └── onzhou │ └── opengles │ └── shader │ └── ExampleUnitTest.java ├── sample-filter ├── .gitignore ├── build.gradle ├── gradle.properties ├── proguard-rules.pro └── src │ ├── main │ ├── debug │ │ └── AndroidManifest.xml │ ├── java │ │ └── com │ │ │ └── onzhou │ │ │ └── opengles │ │ │ ├── filter │ │ │ ├── BaseFilter.java │ │ │ ├── GrayFilter.java │ │ │ ├── OriginFilter.java │ │ │ ├── QuarterMirrorFilter.java │ │ │ └── RendererFilter.java │ │ │ ├── main │ │ │ └── FilterActivity.java │ │ │ ├── renderer │ │ │ └── FilterRenderer.java │ │ │ └── view │ │ │ └── OpenGLView.java │ ├── release │ │ └── AndroidManifest.xml │ └── res │ │ ├── layout │ │ └── activity_filter.xml │ │ ├── menu │ │ └── menu_filter.xml │ │ ├── raw │ │ ├── gray_filter_fragment_shader.glsl │ │ ├── gray_filter_vertex_shader.glsl │ │ ├── no_filter_fragment_shader.glsl │ │ ├── no_filter_vertex_shader.glsl │ │ ├── quarter_mirror_filter_fragment_shader.glsl │ │ └── quarter_mirror_filter_vertex_shader.glsl │ │ └── values │ │ └── strings.xml │ └── test │ └── java │ └── com │ └── onzhou │ └── opengles │ └── filter │ └── ExampleUnitTest.java ├── sample-native ├── .gitignore ├── CMakeLists.txt ├── build.gradle ├── gradle.properties ├── proguard-rules.pro └── src │ ├── main │ ├── cpp │ │ ├── native_window.cpp │ │ └── native_window.h │ ├── debug │ │ └── AndroidManifest.xml │ ├── java │ │ └── com │ │ │ └── onzhou │ │ │ └── opengles │ │ │ ├── main │ │ │ └── NativeWindowActivity.java │ │ │ └── nativewindow │ │ │ └── NativeWindowSample.java │ ├── release │ │ └── AndroidManifest.xml │ └── res │ │ ├── drawable-xxhdpi │ │ └── main.jpg │ │ ├── layout │ │ └── activity_native_window.xml │ │ └── values │ │ └── strings.xml │ └── test │ └── java │ └── com │ └── onzhou │ └── opengles │ └── nativewindow │ └── ExampleUnitTest.java ├── sample-texture ├── .gitignore ├── build.gradle ├── gradle.properties ├── proguard-rules.pro └── src │ ├── main │ ├── debug │ │ └── AndroidManifest.xml │ ├── java │ │ └── com │ │ │ └── onzhou │ │ │ └── opengles │ │ │ ├── main │ │ │ └── TextureActivity.java │ │ │ └── texture │ │ │ └── TextureRenderer.java │ ├── release │ │ └── AndroidManifest.xml │ └── res │ │ ├── drawable-xxhdpi │ │ └── main.jpg │ │ ├── raw │ │ ├── fragment_texture_shader.glsl │ │ └── vertex_texture_shader.glsl │ │ └── values │ │ └── strings.xml │ └── test │ └── java │ └── com │ └── onzhou │ └── opengles │ └── texture │ └── ExampleUnitTest.java ├── screenshots ├── 20181105121623778.png ├── 20181109133909448.png ├── 20181110174836154.png └── 20181112222945107.png └── settings.gradle /.gitignore: -------------------------------------------------------------------------------- 1 | ### Android Studio Eclipse template 2 | .gradle 3 | .idea 4 | .settings 5 | bin 6 | build 7 | gen 8 | .classpath 9 | .project 10 | local.properties 11 | *.iml 12 | obj 13 | .externalNativeBuild 14 | .cxx -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | 2 | 3 | ## android平台opengles3.0实践学习 4 | 5 | - [android平台下OpenGLES3.0从零开始](https://github.com/byhook/opengles4android/blob/master/readme/android平台下OpenGLES3.0从零开始.md) 6 | - [android平台下OpenGLES3.0绘制纯色背景](https://github.com/byhook/opengles4android/blob/master/readme/android平台下OpenGLES3.0绘制纯色背景.md) 7 | - [android平台下OpenGLES3.0绘制圆点、直线和三角形](https://github.com/byhook/opengles4android/blob/master/readme/android平台下OpenGLES3.0绘制圆点、直线和三角形.md) 8 | - [android平台下OpenGLES3.0绘制彩色三角形](https://github.com/byhook/opengles4android/blob/master/readme/android平台下OpenGLES3.0绘制彩色三角形.md) 9 | - [android平台下OpenGLES3.0从矩形中看矩阵和正交投影](https://github.com/byhook/opengles4android/blob/master/readme/android平台下OpenGLES3.0从矩形中看矩阵和正交投影.md) 10 | - [android平台下OpenGLES3.0着色语言基础知识(上)](https://github.com/byhook/opengles4android/blob/master/readme/android平台下OpenGLES3.0着色语言基础知识上.md) 11 | - [android平台下OpenGLES3.0着色语言基础知识(下)](https://github.com/byhook/opengles4android/blob/master/readme/android平台下OpenGLES3.0着色语言基础知识下.md) 12 | - [android平台下OpenGLES3.0实例详解顶点属性、顶点数组](https://github.com/byhook/opengles4android/blob/master/readme/android平台下OpenGLES3.0实例详解顶点属性、顶点数组.md) 13 | - [android平台下OpenGLES3.0实例详解顶点缓冲区对象(VBO)和顶点数组对象(VAO)](https://github.com/byhook/opengles4android/blob/master/readme/android平台下OpenGLES3.0实例详解顶点缓冲区对象VBO和顶点数组对象VAO.md) 14 | - [android平台下OpenGLES3.0绘制立方体的几种方式](https://github.com/byhook/opengles4android/blob/master/readme/android平台下OpenGLES3.0绘制立方体的几种方式.md) 15 | - [android平台下OpenGLES3.0实现2D纹理贴图显示bitmap](https://github.com/byhook/opengles4android/blob/master/readme/android平台下OpenGLES3.0实现2D纹理贴图显示bitmap.md) 16 | - [android平台下OpenGLES3.0使用GLSurfaceView对相机Camera预览实时处理](https://github.com/byhook/opengles4android/blob/master/readme/android平台下OpenGLES3.0使用GLSurfaceView对相机Camera预览实时处理.md) 17 | - [android平台下OpenGLES3.0使用TextureView对相机Camera预览实时处理](https://github.com/byhook/opengles4android/blob/master/readme/android平台下OpenGLES3.0使用TextureView对相机Camera预览实时处理.md) 18 | - [android平台下基于ANativeWindow实现渲染bitmap对象](https://github.com/byhook/opengles4android/blob/master/readme/android平台下基于ANativeWindow实现渲染bitmap对像.md) 19 | 20 | 21 | ## 效果预览 22 | 23 |
24 | 25 | 26 |
27 | 28 | 29 |
30 | 31 | 32 |
33 | 34 | -------------------------------------------------------------------------------- /app/.gitignore: -------------------------------------------------------------------------------- 1 | /build 2 | -------------------------------------------------------------------------------- /app/build.gradle: -------------------------------------------------------------------------------- 1 | apply plugin: 'com.android.application' 2 | 3 | android { 4 | //构建版本 5 | compileSdkVersion rootProject.ext.android.compileSdkVersion 6 | //默认的配置 7 | defaultConfig { 8 | minSdkVersion rootProject.ext.android.minSdkVersion 9 | targetSdkVersion rootProject.ext.android.targetSdkVersion 10 | versionCode rootProject.ext.android.versionCode 11 | versionName rootProject.ext.android.versionName 12 | } 13 | buildTypes { 14 | release { 15 | minifyEnabled false 16 | proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' 17 | } 18 | } 19 | 20 | sourceSets { 21 | main { 22 | //库地址 23 | jniLibs.srcDirs = ['libs'] 24 | } 25 | } 26 | } 27 | 28 | dependencies { 29 | implementation fileTree(include: ['*.jar'], dir: 'libs') 30 | 31 | implementation "androidx.core:core-ktx:${versions.coreKtxVersion}" 32 | implementation "androidx.appcompat:appcompat:${versions.appcompatVersion}" 33 | implementation "com.google.android.material:material:${versions.materialVersion}" 34 | implementation "androidx.constraintlayout:constraintlayout:${versions.constraintlayoutVersion}" 35 | testImplementation "junit:junit:${versions.junitVersion}" 36 | androidTestImplementation "androidx.test.ext:junit:${versions.junitExtVersion}" 37 | androidTestImplementation "androidx.test.espresso:espresso-core:${versions.espressoVersion}" 38 | 39 | implementation project(':common-base') 40 | //示例组件 41 | implementation project(':sample-basis') 42 | implementation project(':sample-color') 43 | implementation project(':sample-native') 44 | implementation project(':sample-texture') 45 | implementation project(':sample-camera') 46 | implementation project(':sample-filter') 47 | } 48 | -------------------------------------------------------------------------------- /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/main/AndroidManifest.xml: -------------------------------------------------------------------------------- 1 | 4 | 5 | 8 | 9 | 18 | 19 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | -------------------------------------------------------------------------------- /app/src/main/java/com/onzhou/opengles/main/SampleApplication.java: -------------------------------------------------------------------------------- 1 | package com.onzhou.opengles.main; 2 | 3 | import android.app.Application; 4 | 5 | import com.onzhou.opengles.core.AppCore; 6 | 7 | /** 8 | * @anchor: andy 9 | * @date: 2019-03-27 10 | * @description: 11 | */ 12 | public class SampleApplication extends Application { 13 | 14 | @Override 15 | public void onCreate() { 16 | super.onCreate(); 17 | AppCore.getInstance().init(this); 18 | } 19 | 20 | } 21 | -------------------------------------------------------------------------------- /app/src/main/java/com/onzhou/opengles/sample/SampleActivity.java: -------------------------------------------------------------------------------- 1 | package com.onzhou.opengles.sample; 2 | 3 | import android.app.NativeActivity; 4 | import android.os.Bundle; 5 | import android.view.View; 6 | 7 | import androidx.annotation.Nullable; 8 | 9 | import com.onzhou.opengles.base.AbsBaseActivity; 10 | import com.onzhou.opengles.main.CameraSurfaceActivity; 11 | import com.onzhou.opengles.main.ColorActivity; 12 | import com.onzhou.opengles.main.FilterActivity; 13 | import com.onzhou.opengles.main.NativeWindowActivity; 14 | import com.onzhou.opengles.main.SimpleActivity; 15 | import com.onzhou.opengles.main.TextureActivity; 16 | 17 | 18 | /** 19 | * @anchor: andy 20 | * @date: 2019-03-27 21 | * @description: 22 | */ 23 | public class SampleActivity extends AbsBaseActivity { 24 | 25 | @Override 26 | protected void onCreate(@Nullable Bundle savedInstanceState) { 27 | super.onCreate(savedInstanceState); 28 | setContentView(R.layout.activity_opengles_sample); 29 | } 30 | 31 | public void onBasisClick(View view) { 32 | SimpleActivity.intentStart(this); 33 | } 34 | 35 | public void onColorClick(View view) { 36 | ColorActivity.intentStart(this); 37 | } 38 | 39 | /** 40 | * 基于JNI实现的OpenGLES相关操作 41 | * 42 | * @param view 43 | */ 44 | public void onNativeClick(View view) { 45 | NativeWindowActivity.intentStart(this); 46 | } 47 | 48 | /** 49 | * 图片纹理处理 50 | * 51 | * @param view 52 | */ 53 | public void onTextureClick(View view) { 54 | TextureActivity.intentStart(this); 55 | } 56 | 57 | /** 58 | * 黑白相机实现 59 | * 60 | * @param view 61 | */ 62 | public void onCameraClick(View view) { 63 | CameraSurfaceActivity.intentStart(this); 64 | } 65 | 66 | /** 67 | * 滤镜实现 68 | * 69 | * @param view 70 | */ 71 | public void onFilterClick(View view) { 72 | FilterActivity.intentStart(this); 73 | } 74 | } 75 | -------------------------------------------------------------------------------- /app/src/main/res/layout/activity_opengles_sample.xml: -------------------------------------------------------------------------------- 1 | 2 | 7 | 8 | 12 | 13 |