美文网首页openglOpenGL
OpenGL系列之一:OpenGL第一个程序

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

作者: itfitness | 来源:发表于2022-11-24 16:21 被阅读0次

    目录

    前言

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

    相关文章

      网友评论

        本文标题:OpenGL系列之一:OpenGL第一个程序

        本文链接:https://www.haomeiwen.com/subject/glvzxdtx.html