OpenGL系列之一:OpenGL第一个程序

目录

前言

最近开始抽时间学习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 
#include 
#include 

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();
    //摄像机(-1,1,-1,1是设置是设置坐标系最大为1最小为-1)
    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)
    }
}

你可能感兴趣的:(OpenGL系列之一:OpenGL第一个程序)