android平臺下OpenGL ES 3.0繪製純色背景
阿新 • • 發佈:2018-11-06
OpenGL ES 3.0學習實踐
- android平臺下OpenGL ES 3.0從零開始
- android平臺下OpenGL ES 3.0繪製純色背景
- android平臺下OpenGL ES 3.0繪製圓點、直線和三角形
- android平臺下OpenGL ES 3.0繪製彩色三角形
- android平臺下OpenGL ES 3.0從矩形中看矩陣和座標系
目錄
新建工程
RendererActivity檔案
public class RendererActivity extends AbsBaseActivity {
private GLSurfaceView mGLSurfaceView;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setupViews();
}
private void setupViews() {
mGLSurfaceView = new GLSurfaceView( this);
setContentView(mGLSurfaceView);
//設定版本
mGLSurfaceView.setEGLContextClientVersion(3);
//GLSurfaceView.Renderer renderer = new ColorRenderer(Color.GRAY);
GLSurfaceView.Renderer renderer = new NativeColorRenderer(Color.GRAY);
mGLSurfaceView.setRenderer (renderer);
}
}
基於SDK實現渲染器
新建渲染器ColorRenderer
檔案
public class ColorRenderer implements GLSurfaceView.Renderer {
private int color;
public ColorRenderer(int color) {
this.color = color;
}
@Override
public void onSurfaceCreated(GL10 gl, EGLConfig config) {
//設定背景顏色
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);
}
@Override
public void onSurfaceChanged(GL10 gl, int width, int height) {
//設定檢視視窗
GLES30.glViewport(0, 0, width, height);
}
@Override
public void onDrawFrame(GL10 gl) {
//把顏色緩衝區設定為我們預設的顏色
GLES30.glClear(GL10.GL_COLOR_BUFFER_BIT);
}
}
基於NDK實現渲染器
新建渲染器NativeColorRenderer
檔案
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;
}
@Override
public void onSurfaceCreated(GL10 gl, EGLConfig config) {
surfaceCreated(color);
}
@Override
public void onSurfaceChanged(GL10 gl, int width, int height) {
surfaceChanged(width, height);
}
@Override
public void onDrawFrame(GL10 gl) {
onDrawFrame();
}
}
配置對應的CMakeLists.txt
檔案
cmake_minimum_required(VERSION 3.4.1)
##官方標準配置
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wall")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -std=c++11 -fno-rtti -fno-exceptions -Wall")
##ANDROID_PLATFORM_LEVEL=18
add_definitions("-DDYNAMIC_ES3")
set(OPENGL_LIB GLESv3)
add_library(native-color
SHARED
src/main/cpp/native_color.cpp)
target_link_libraries(native-color
${OPENGL_LIB}
android
EGL
log
m)
編寫對應的native_color.cpp類
#include <jni.h>
#include <EGL/egl.h>
#include <GLES3/gl3.h>
#include "native_color.h"
/**
* 動態註冊
*/
JNINativeMethod methods[] = {
{"surfaceCreated", "(I)V", (void *) surfaceCreated},
{"surfaceChanged", "(II)V", (void *) surfaceChanged},
{"onDrawFrame", "()V", (void *) onDrawFrame}
};
/**
* 動態註冊
* @param env
* @return
*/
jint registerNativeMethod(JNIEnv *env) {
jclass cl = env->FindClass("com/onzhou/opengles/color/NativeColorRenderer");
if ((env->RegisterNatives(cl, methods, sizeof(methods) / sizeof(methods[0]))) < 0) {
return -1;
}
return 0;
}
/**
* 載入預設回撥
* @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) {
//把顏色緩衝區設定為我們預設的顏色
glClear(GL_COLOR_BUFFER_BIT);
}
實現效果:
專案地址:
https://github.com/byhook/opengles4android
參考:
《OpenGL ES 3.0 程式設計指南第2版》
《OpenGL ES應用開發實踐指南Android卷》