NDK-第一个OpenGL示例

该博客详细介绍了如何在Android应用中使用OpenGL ES进行3D模型渲染。首先,通过Java层创建GLSurfaceView并设置渲染器,然后在C++层加载GLSL着色器代码,处理纹理和模型数据。利用AssetManager从assets目录读取文件,实现了从JNI层读取顶点和片段着色器,以及纹理图片。通过JNI方法调用,将C++层的初始化、视口变化、渲染帧等操作与Java层交互。最后展示了实际运行的效果。

代码结构如下:

一、Java层

LammyGLSurfaceView.java(用于展示渲染的OpenGL模型)

package com.example.lammy.openglstudy;

import android.content.Context;
import android.opengl.GLSurfaceView;
import android.util.AttributeSet;

public class LammyGLSurfaceView extends GLSurfaceView {
   
   
    private LammyRenderer lammyRenderer;
    public LammyGLSurfaceView(Context context) {
   
   
        super(context);
        init();
    }

    public LammyGLSurfaceView(Context context, AttributeSet attrs) {
   
   
        super(context, attrs);
        init();
    }

    private void  init(){
   
   
        lammyRenderer = new LammyRenderer();
        Native.InitAssetManager(getContext().getAssets());
        // 这里申请 2 版本环境,若想3 则需要在 jni 层面去做
        setEGLContextClientVersion(2);
        setRenderer(lammyRenderer);// 设置OpenGL渲染器
    }
}

LammyRender.java(定义OpenGL渲染器)

package com.example.lammy.openglstudy;

import android.opengl.GLSurfaceView;
import javax.microedition.khronos.egl.EGLConfig;
import javax.microedition.khronos.opengles.GL10;

public class LammyRenderer implements GLSurfaceView.Renderer {
   
   
    @Override
    public void onSurfaceCreated(GL10 gl, EGLConfig config) {
   
   
        // gl.glClearColor(0.1f , 0.4f,0.6f , 1f);
       Log.loge("onSurfaceCreated ...........");
       Native.InitOpenGL();
    }

    @Override
    public void onSurfaceChanged(GL10 gl, int width, int height) {
   
   
        // gl.glViewport(0,0,width ,height);
        Log.loge("onSurfaceChanged ...........");
        Native.OnViewportChanged((float)width ,(float) height);
    }

    @Override
    public void onDrawFrame(GL10 gl) {
   
   
        // gl.glClear(gl.GL_COLOR_BUFFER_BIT);
        // Log.loge("onDrawFrame ...........");
        Native.RenderOneFrame();
    }
}

Log.java(打印日志)

package com.example.lammy.openglstudy;

public class  Log{
   
   
    public static  void loge(String s){
   
   
        android.util.Log.e("lammy-java-log:" , s );
    }
}

MainActivity.java(主入口程序)

package com.example.lammy.openglstudy;

import android.os.Bundle;
import android.os.Environment;
import androidx.appcompat.app.AppCompatActivity;

public class MainActivity extends AppCompatActivity {
   
   
    private LammyGLSurfaceView lammyGLSurfaceView;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
   
   
        super.onCreate(savedInstanceState);
        lammyGLSurfaceView = new LammyGLSurfaceView(this);
        setContentView(lammyGLSurfaceView);
        Log.loge(Environment.getExternalStorageState());
    }
}

Native.java(加载本地库并声明要调用的C函数)

package com.example.lammy.openglstudy;

import android.content.res.AssetManager;

public class Native {
   
   
    static {
   
   
        System.loadLibrary("native-lib");// 注意名称与CMakeLists.txt中一致
    }

    public static native void InitAssetManager(AssetManager am);
    public static native void InitOpenGL();
    public static native void OnViewportChanged(float width, float height);
    public static native void RenderOneFrame();
}
二、C++层

导入GLM库(glm是数学库,用于处理矩阵):https://sourceforge.net/projects/ogl-math/
导入时候只要将整个文件拷贝至cpp文件。要注意在CMakeLists.txt文件中配置头文件路径。

ggl.h(打印日志)

#ifndef OPENGLSTUDY_GGL_H
    #define OPENGLSTUDY_GGL_H
#endif

#
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

itzyjr

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值