OpenGL ES学习

来源:互联网 发布:淘宝账号怎么找回来 编辑:程序博客网 时间:2024/06/05 00:24

GLSurfaceView 用于创建一个OpenGL绘图的窗口
GLSurfaceView.Renderer 控制在窗口中绘制的内容

在OpenGL ES 中GLSurfaceView 更适合绘制一些full screen或者接近full screen的应用,对于只绘制一部分的,可以使用TextureView

要想使用OpenGL ES,就得先去实现GLSurfaceView 以及 GLSurfaceView.Renderer

下面是实现过程:

1. Declare OpenGL ES Use in the Manifest

<uses-feature android:glEsVersion="0x00020000" android:required="true" />

GLSurfaceView 的作用类似于平时我们写的layout,可以直接通过

public class OpenGLES20Activity extends Activity {    private GLSurfaceView mGLView;    @Override    public void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        // Create a GLSurfaceView instance and set it        // as the ContentView for this Activity.        mGLView = new MyGLSurfaceView(this);        setContentView(mGLView);    }}

类似于加载layout的方式加载进来。但是layout相当于是常量

但是在GLSurfaceView 中画什么,我们需要控制GLSurfaceView.Renderer来实现,也就是写一个类来实现GLSurfaceView.Renderer这一接口

class MyGLSurfaceView extends GLSurfaceView {    private final MyGLRenderer mRenderer;    public MyGLSurfaceView(Context context){        super(context);        // Create an OpenGL ES 2.0 context        setEGLContextClientVersion(2);        mRenderer = new MyGLRenderer();        // Set the Renderer for drawing on the GLSurfaceView        setRenderer(mRenderer);    }}

在GLSurfaceView 中需要保证的基本代码有这些,主要是声明一个mRenderer 告知要用这个render来绘制。
需要注意的是: 可以加入以下这句话来提高代码速度

 // Render the view only when there is a change in the drawing data        setRenderMode(GLSurfaceView.RENDERMODE_WHEN_DIRTY);

2. Build a Renderer Class

需要实现以下三个函数:
onSurfaceCreated() – 用于建立绘图的基本环境,只会被调用一次
onDrawFrame() – 每次需要重新绘图的时候都会被调用
onSurfaceChanged() –如果绘图窗口的形状发生改变时会被调用,比如手机屏幕旋转
一个最基本的实现是这样的

public class MyGLRenderer implements GLSurfaceView.Renderer {    public void onSurfaceCreated(GL10 unused, EGLConfig config) {        // Set the background frame color        GLES20.glClearColor(0.0f, 0.0f, 0.0f, 1.0f);    }    public void onDrawFrame(GL10 unused) {        // Redraw background color        GLES20.glClear(GLES20.GL_COLOR_BUFFER_BIT);    }    public void onSurfaceChanged(GL10 unused, int width, int height) {        GLES20.glViewport(0, 0, width, height);    }}

这个就是让屏幕全黑,因为初始化为GLES20.glClearColor(0.0f, 0.0f, 0.0f, 1.0f);
注意GL10 unused要设置,因为我们是基于OpenGL ES 2.0的接口

1 0
原创粉丝点击