Android OpenGL探索之纯色背景绘制
生活随笔
收集整理的這篇文章主要介紹了
Android OpenGL探索之纯色背景绘制
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
簡介
本系列主要介紹OpenGL在Android平臺上的應用。
繪制純色背景
GLSurfaceView 類提供了一些輔助類來管理 EGL contexts,通過實現(xiàn)GLSurfaceView.Renderer接口可以實現(xiàn)純色背景的繪制
1.純JAVA方式
public class OpenGLTest1Activity extends Activity {private static final String TAG = "OpenGLTest1Activity";private GLSurfaceView mGLSurfaceView;@Overrideprotected void onCreate(@Nullable Bundle savedInstanceState) {super.onCreate(savedInstanceState);//新建GLSurfaceView并set到Activity的ContentViewmGLSurfaceView = new GLSurfaceView(this);setContentView(mGLSurfaceView);//設置OpenGL版本為3.0mGLSurfaceView.setEGLContextClientVersion(3);//新建一個渲染器ColorRenderer ColorRenderer如下代碼段GLSurfaceView.Renderer renderer = new ColorRenderer(Color.RED);mGLSurfaceView.setRenderer(renderer);} } 復制代碼渲染器ColorRenderer
public class ColorRenderer implements GLSurfaceView.Renderer {private int color;public ColorRenderer(int color) {this.color = color;}@Overridepublic void onSurfaceCreated(GL10 gl10, EGLConfig eglConfig) {float redF = (float) Color.red(color) / 255;float greenF = (float) Color.green(color) / 255;float blueF = (float) Color.blue(color) / 255;float alphaF = (float) Color.alpha(color) / 255;GLES30.glClearColor(redF, greenF, blueF, alphaF);}@Overridepublic void onSurfaceChanged(GL10 gl10, int width, int height) {GLES30.glViewport(0, 0, width, height);}@Overridepublic void onDrawFrame(GL10 gl10) {GLES30.glClear(GL10.GL_COLOR_BUFFER_BIT);} } 復制代碼渲染器的都是在子線程回調(diào)的,不會影響到主線程的操作。
onSurfaceCreated:在view被創(chuàng)建時回調(diào)
onSurfaceChanged:在窗口變換時回調(diào)
onDrawFrame:每16ms刷新一次,與View不同GLSurfaceView屬于被動刷新。接收到vsyn信號時進行刷新
其中涉及到的幾個API
glClearColor(float var0, float var1, float var2, float var3);設置顏色緩存的清除值,可以理解為默認顏色 但是注意這個時候還并沒有應用到這個顏色,只是設置了參數(shù)說明:前三個參數(shù)為顏色值RGB 最后一個參數(shù)是透明度AglViewport(int var0, int var1, int var2, int var3);設置渲染區(qū)域 注意:OpenGL使用的窗口坐標和Android窗口中的坐標是不一樣的之后文章會詳細介紹參數(shù)說明:前兩個參數(shù)是左下角的坐標值一般是 0 后兩個參數(shù)分別是寬度和高度glClear(int var0);做清除操作,可以理解為reset還原的意思參數(shù)說明:還原類型的標示GL_COLOR_BUFFER_BIT 指定當前被激活為寫操作的顏色緩存GL_DEPTH_BUFFER_BIT 指定深度緩存GL_ACCUM_BUFFER_BIT 指定累加緩存GL_STENCIL_BUFFER_BIT 指定模板緩存 復制代碼2、C++實現(xiàn)
首先配置CMakeList.txt 引入GLESv3庫
cmake_minimum_required(VERSION 3.4.1)add_library( native-colorSHAREDsrc/main/cpp/native-color.cpp)target_link_libraries(native-color#鏈接GLESv3庫到共享庫中GLESv3androidEGLlogm) 復制代碼編寫native-color.h 頭文件
// // Created by 吳新禹 on 2019/3/10. // #include <jni.h>#ifndef AVDEMO_NATIVE_COLOR_H #define AVDEMO_NATIVE_COLOR_H #ifdef __cplusplus extern "C" { #endifJNIEXPORT void JNICALL surfaceCreated(JNIEnv *, jobject, jint);JNIEXPORT void JNICALL surfaceChanged(JNIEnv *, jobject, jint, jint);JNIEXPORT void JNICALL onDrawFrame(JNIEnv *, jobject);#ifdef __cplusplus } #endif #endif 復制代碼編寫native-color.cpp 源文件
// // Created by 吳新禹 on 2019/3/10. // #include <jni.h> #include <EGL/egl.h> #include <GLES3/gl3.h>#include "native_color.h"/*** 動態(tài)注冊*/ JNINativeMethod methods[] = {{"surfaceCreated", "(I)V", (void *) surfaceCreated},{"surfaceChanged", "(II)V", (void *) surfaceChanged},{"onDrawFrame", "()V", (void *) onDrawFrame} };/*** 動態(tài)注冊* @param env* @return*/ jint registerNativeMethod(JNIEnv *env) {jclass cl = env->FindClass("com/av/avdemo/opengl/NativeColorRenderer");if ((env->RegisterNatives(cl, methods, sizeof(methods) / sizeof(methods[0]))) < 0) {return -1;}return 0; }/*** 加載默認回調(diào)* @param vm* @param reserved* @return*/ jint JNI_OnLoad(JavaVM *vm, void *reserved) {JNIEnv *env = NULL;if (vm->GetEnv((void **) &env, JNI_VERSION_1_6) != JNI_OK) {return -1;}//注冊方法if (registerNativeMethod(env) != JNI_OK) {return -1;}return JNI_VERSION_1_6; }JNIEXPORT void JNICALL surfaceCreated(JNIEnv *env, jobject obj, jint color) {//分離RGBA的百分比GLfloat redF = ((color >> 16) & 0xFF) * 1.0f / 255;GLfloat greenF = ((color >> 8) & 0xFF) * 1.0f / 255;GLfloat blueF = (color & 0xFF) * 1.0f / 255;GLfloat alphaF = ((color >> 24) & 0xFF) * 1.0f / 255;glClearColor(redF, greenF, blueF, alphaF); }JNIEXPORT void JNICALL surfaceChanged(JNIEnv *env, jobject obj, jint width, jint height) {glViewport(0, 0, width, height); }JNIEXPORT void JNICALL onDrawFrame(JNIEnv *env, jobject obj) {//把顏色緩沖區(qū)設置為我們預設的顏色glClear(GL_COLOR_BUFFER_BIT); } 復制代碼編寫Native渲染器引用Native代碼
public class NativeColorRenderer implements GLSurfaceView.Renderer {static {System.loadLibrary("native-color");}public native void surfaceCreated(int color);public native void surfaceChanged(int width, int height);public native void onDrawFrame();private int color;public NativeColorRenderer(int color) {this.color = color;}@Overridepublic void onSurfaceCreated(GL10 gl, EGLConfig config) {surfaceCreated(color);}@Overridepublic void onSurfaceChanged(GL10 gl, int width, int height) {surfaceChanged(width, height);}@Overridepublic void onDrawFrame(GL10 gl) {onDrawFrame();} } 復制代碼最后的效果
總結(jié)
以上是生活随笔為你收集整理的Android OpenGL探索之纯色背景绘制的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 招商银行笔试题 公司年会
- 下一篇: android 功能防抖,Android