android 中的openGL使用学习笔记

本文介绍如何在Android中使用OpenGL进行基本的3D图形渲染。通过创建自定义Renderer类,实现onDrawFrame、onSurfaceChanged和onSurfaceCreated方法,完成初始化、响应尺寸变化及绘制流程。文章还详细讲解了设置投影矩阵、清除缓存、顶点数据处理等关键步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

关于openGL的介绍网上随便搜搜就有,这里就不再介绍了。本文主要说一下openGL在android中的初步使用。

在andorid中我们需要通过GLSurfaceView来将openGL视图显示在Activity中。而GLSurfaceView需要一个实现了Renderer接口的类来渲染视图。接下来我们就来构建一个自己的Renderer类:

首先,新建一个实现了Renderer接口的类取名MyRenderer,并重写如下方法

//绘制当前屏幕的代码写在此方法中 

public void onDrawFrame(GL10 gl) 
{}
// 当屏幕大小改变时被调用
public void onSurfaceChanged(GL10 gl, int width, int height)
{}
//当窗口被创建时被调用,进行一些初始化工作 
public void onSurfaceCreated(GL10 gl, EGLConfig config)
{}

onSurfaceCreated方法会在窗口被创建时调用,通常我们在此方法中对openGL做一些初始化工作,比如

        // 启用阴影平滑
        gl.glShadeModel(GL10.GL_SMOOTH);
        
        // 设置背景为黑色(rgba)
        gl.glClearColor(0, 0, 0, 0);

        // 设置深度缓存几乎所有在屏幕上显示3D场景OpenGL程序都使用深度缓存。它的排序决定那个物体先画,
        //启用深度缓存可以让 OpenGL知道绘制在场景中的物体的深度关系,这样我们绘制物体时,
        //就不会将后面的物体绘制到前面的物体上来。
        gl.glClearDepthf(1.0f); 
                           
        // 启用深度测试
        gl.glEnable(GL10.GL_DEPTH_TEST);   
                     
        // 所作深度测试的类型
        gl.glDepthFunc(GL10.GL_LEQUAL);                            
        
        // 告诉系统对透视进行修正
        gl.glHint(GL10.GL_PERSPECTIVE_CORRECTION_HINT, GL10.GL_FASTEST);
当窗口的场景大小发生改变时会调用onSurfaceChanged方法,我们在此方法中调用gl.glViewport(0, 0, width, height)来设置openGL的场景大小。并通过如下代码来使openGL绘制物体时有透视的效果

float ratio = (float) width / height;  

//设置投影矩阵 

gl.glMatrixMode(GL10.GL_PROJECTION);

//重置投影矩阵

gl.glLoadIdentity();

// 设置视口的大小

gl.glFrustumf(-ratio, ratio, -1, 1, 1, 10);  

// 选择模型观察矩阵

gl.glMatrixMode(GL10.GL_MODELVIEW);  
  
// 重置模型观察矩阵

gl.glLoadIdentity();

在onDrawFrame方法中写绘图所用的具体代码,通在常此方法中先清除屏幕缓存和深度缓存并重置矩阵

//清除深度缓存
gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT);  
//重置矩阵
gl.glLoadIdentity(); 
想要绘图我们还需要通过glVertexPointer(int size,int type,int stride,Buffer pointer)方法来告诉openGL所要绘制的图形的顶点数据,例如绘制一个三角形我们可以定义顶点坐标如下:
private float vertex[] =  {

  0.0f, 1.0f,0.0f,    //上顶点
 -1.0f,-1.0f,0.0f,    //左下点
  1.0f,-1.0f,0.0f,    //右下点
};

方法中的参数size表示点的维度,type描述顶点的类型,stride描述顶点与顶点间的字节偏移量,pointer是存放顶点坐标数据

的缓存引用,在openGL中为了提高效率,glVertexPointer仅接受与语言无关的本地缓冲区,而不是java浮点数组,

因此我们需要使用java.nio类将浮点数组转换为本地缓冲区。

步骤如下:

ByteBuffer tbb = ByteBuffer.allocateDirect(vertex.length * 4);//4表示每个浮点数占4个字节

tbb.order(ByteOrder.nativeOrder());

TrianBuffer = tbb.asFloatBuffer();

TrianBuffer.put(vertex);

TrianBuffer.position(0);

设置好了顶点数组,我们就可以通过 glDrawArrays(int mod e,int f irst,int count) 函数将这些顶点绘制出来,

mode描述了绘制模式,指定它为GLTRIANGLES来表示绘制三角形:

绘制前需要通过gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);启用顶点数组,绘制完后记得要调用gl.glDisableClientState(GL10.GL_VERTEX_ARRAY);关闭


接下来我们需要在Activity的onCreate方法中将openGL绘制的视图显示出来,步骤如下:

先创建一个GLSurfaceView对象glview,然后调用glview.setRenderer(render);此处的render引用即为我们刚刚所创建的MyRenderer类的实例对象。

最后调用setContentView(glview)方法;

未完待续------


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值