快过年了,提前跟大家说一声 “中秋快乐!”哈哈哈。。。
今天开始,我要写个关于OpenGL教学的系列文章,目的是想整理一下工作中接触到的OpenGL知识,同时也想把一些简单的入门知识分享给大家,方便大家入门。如果你不小心读到它,产生了些许疑问或者发现了文章中错误,再或者想与我有更多沟通交流的,都可以联系我。
简介:OpenGL(Open Graphics Library,译名:开放图形库或者“开放式图形库”)是用于渲染2D、3D矢量图形的跨语言、跨平台的应用程序编程接口(API)。 这个接口由近350个不同的函数调用组成,用来绘制从简单的图形比特到复杂的三维景象。学好了OpenGL ,就可以在那些支持OpenGL的机器上正常使用这些接口,在屏幕上看到绘制的结果。
正式开始,在安卓开发中,最简单的openGL使用就3步:
- 继承GLSurfaceView
- 实现接口 GLSurfaceView.Renderer
- 布局中引用
来,敲代码,这里以实现绘制一屏红色为例。
1.继承GLSurfaceView
自定义一个View,新建一个类,继承GLSurfaceView,在构造方法里调用GLSurfaceView的setRenderer方法。
package com.york.media.opengl.egl;
import android.content.Context;
import android.opengl.GLSurfaceView;
import android.util.AttributeSet;
/**
* author : York
* date : 2020/12/17 21:57
* desc : 最简单的OpenGL使用方法
*/
public class YGLSurfaceView extends GLSurfaceView {
public YGLSurfaceView(Context context) {
super(context);
}
public YGLSurfaceView(Context context, AttributeSet attrs) {
super(context, attrs);
//1.自定义的 Render,在 Render中实现绘制
YGLRender yGLRender = new YGLRender();
//2.调用 GLSurfaceView的setRenderer方法
setRenderer(yGLRender);
}
}
2.实现 GLSurfaceView.Renderer 接口
自定义一个 Render,实现GLSurfaceView.Renderer接口,然后在 Render中完成绘制。
package com.york.media.opengl.egl;
import android.opengl.GLES20;
import android.opengl.GLSurfaceView;
import javax.microedition.khronos.egl.EGLConfig;
import javax.microedition.khronos.opengles.GL10;
/**
* author : York
* date : 2020/12/17 21:58
* desc : Render中使用红色清屏
*/
public class YGLRender implements GLSurfaceView.Renderer {
public YGLRender() {
}
@Override
public void onSurfaceCreated(GL10 gl10, EGLConfig eglConfig) {
}
@Override
public void onSurfaceChanged(GL10 gl10, int with, int height) {
GLES20.glViewport(0, 0, with, height);
}
@Override
public void onDrawFrame(GL10 gl10) {
//使用红色清屏
GLES20.glClear(GLES20.GL_COLOR_BUFFER_BIT);
GLES20.glClearColor(1f,0f,0f,1f);
}
}
布局中引用自定义的GLSurfaceView
最后,在布局中引用自定义的GLSurfaceView,就可以显示出红色了。
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<com.york.media.opengl.egl.YGLSurfaceView
android:layout_width="match_parent"
android:layout_height="match_parent"/>
</RelativeLayout>
效果是这样的: