目录
前言
最近开始抽时间学习OpenGL,然后把每次的学习在这里记录一下
实现效果
绘制红色
实现步骤
1.搭建NDK环境
这里没有用Android Studio自动生成的NDK环境,而是用普通的项目,配置成NDK环境,首先第一步配置app的gradle文件。
增加如下内容:
plugins {
id 'com.android.application'
id 'kotlin-android'
}
android {
compileSdk 32
defaultConfig {
applicationId "com.itfitness.opengldemo"
minSdk 21
targetSdk 32
versionCode 1
versionName "1.0"
testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
externalNativeBuild{
cmake{
cppFlags ""
}
}
ndk{
abiFilters 'armeabi-v7a'
}
}
...省略部分代码
sourceSets {
main {
jniLibs.srcDirs = ['libs']
}
}
externalNativeBuild{
cmake{
path 'CMakeLists.txt'
}
}
}
dependencies {
...省略部分代码
}
然后新建CMakeLists.txt:
内容如下:
cmake_minimum_required(VERSION 3.10)
add_library(CCOpenGLRender SHARED src/main/cpp/CCOpenGLRender.cpp)
target_link_libraries(
CCOpenGLRender
-lGLESv1_CM #OpenGL V1
-lGLESv2 #OpenGL V2
log
)
然后在main文件夹下新建cpp文件夹,在cpp文件夹下新建CCOpenGLRender.cpp文件
这时我们可以关闭Android Studio再打开,否则的话新建的native函数链接没提示
2.新建渲染器
创建GLSurfaceView的渲染器
class GLRender : GLSurfaceView.Renderer{
init {
System.loadLibrary("CCOpenGLRender")
}
private external fun ndkInitGL()
private external fun ndkPaintGL()
private external fun ndkResizeGL(width:Int,height:Int)
override fun onSurfaceCreated(p0: GL10?, p1: EGLConfig?) {
//初始化
ndkInitGL()
}
override fun onSurfaceChanged(p0: GL10?, p1: Int, p2: Int) {
//改变大小
ndkResizeGL(p1,p2)
}
override fun onDrawFrame(p0: GL10?) {
//绘制
ndkPaintGL()
}
}
NDK代码如下:
#include <jni.h>
#include <GLES/gl.h>
#include <GLES2/gl2.h>
extern "C"
JNIEXPORT void JNICALL
Java_com_itfitness_opengldemo_GLRender_ndkInitGL(JNIEnv *env, jobject thiz) {
//清空颜色(以红色进行清空)
glClearColor(1.0,0,0,1.0);
//清空深度缓存
glClearDepthf(1.0);
//开启深度测试
glEnable(GL_DEPTH_TEST);
//什么情况下使用深度测试
glDepthFunc(GL_LEQUAL);
}
extern "C"
JNIEXPORT void JNICALL
Java_com_itfitness_opengldemo_GLRender_ndkPaintGL(JNIEnv *env, jobject thiz) {
//清空颜色缓冲区或深度缓冲区
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
glLoadIdentity();
}
extern "C"
JNIEXPORT void JNICALL
Java_com_itfitness_opengldemo_GLRender_ndkResizeGL(JNIEnv *env, jobject thiz, jint width,
jint height) {
//设置窗口大小
glViewport(0,0,width,height);
//投影矩阵
glMatrixMode(GL_PROJECTION);
//重置投影矩阵
glLoadIdentity();
//摄像机
glOrthof(-1,1,-1,1,0.1,1000);
}
3.GLSurfaceView设置渲染器
我们在Activity中创建一个GLSurfaceView将上面创建的渲染器设置给GLSurfaceView,并把GLSurfaceView作为Activity的ContentView:
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
val glSurfaceView = GLSurfaceView(this)
glSurfaceView.setRenderer(GLRender())
setContentView(glSurfaceView)
}
}
网友评论