代码结构如下:

一、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
#

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

被折叠的 条评论
为什么被折叠?



