android-OpenGL

  1. OpenGL有自己的Surface –> GLSurfaceView
  2. GLSurfaceView需要你注册一个Renderder,它是GLSurfaceView.Renderer接口,一般来说多是自己实现的
  3. 判断是否支持opengl
private void checkSupported() {
        ActivityManager activityManager = (ActivityManager) getSystemService(ACTIVITY_SERVICE);
        ConfigurationInfo configurationInfo = activityManager.getDeviceConfigurationInfo();
        supportsEs2 = configurationInfo.reqGlEsVersion >= 0x2000;

        boolean isEmulator = Build.VERSION.SDK_INT > Build.VERSION_CODES.ICE_CREAM_SANDWICH_MR1
                && (Build.FINGERPRINT.startsWith("generic")
                || Build.FINGERPRINT.startsWith("unknown")
                || Build.MODEL.contains("google_sdk")
                || Build.MODEL.contains("Emulator")
                || Build.MODEL.contains("Android SDK built for x86"));

        supportsEs2 = supportsEs2 || isEmulator;
}

GLSurfaceView OpenGL显示的view

setRenderer()               //设置画笔(也就是渲染者)
setRenderMode()             //设置渲染的模式
requestRender()             //告诉它的画笔(GLSurfaceView.Renderer),要重新画画(渲染)
setDebugFlags(int)     
setEGLConfigChooser(boolean)
setEGLConfigChooser(EGLConfigChooser)     
setEGLConfigChooser(int, int, int, int, int, int)     
setGLWrapper(GLWrapper)
setEGLContextClientVersion(2);      // 设置OpenGl ES的版本为2.0   
  • setRenderMode      //设置渲染的模式

第一种模式(RENDERMODE_CONTINUOUSLY):
连续不断的刷,画完一幅图马上又画下一幅。这种模式很明显是用来画动画的


第二种模式(RENDERMODE_WHEN_DIRTY):
只有在需要重画的时候才画下一幅。这种模式就比较节约CPU和GPU一些,适合用来>画不经常需要刷新的情况。
多说一句,系统如何知道需要重画了呢?当然是你要告诉它……
调用GLSurfaceView的requestRender ()方法,告诉它,你脏了。

GLSurfaceView.Renderer 渲染器

onSurfaceCreated()              //Surface创建的时候被调用
onSurfaceChanged()              //Surface大小改变
onDrawFrame()                   //绘制的时候
  • onSurfaceCreated

    此方法看名字就知道它是在Surface创建的时候被调用的。
    因此我们可以在这个函数的实现中做一些初始化的工作。
    例如取出文房四宝、铺好画布、调好颜料之类的。它的函数原


    第二个参数在文档中没有关于它的任何public方法和域。因此我们可以不用管它。
    第一个参数非常重要。如果说Renderer是画笔的话,那么这个gl参数,就可以说是我们的手了。
    如何操作这支画笔,都是它说了算!所以我们绝大部分时候都是通过这个叫做gl的手来指挥Renderer画图的。

  • onSurfaceChanged

    当GLSurfaceView大小改变时,对应的Surface大小也会改变。值得注意的是,
    在Surface刚创建的时候,它的size其实是0,也就是说在画第一次图之前它也会被调用一次的。
    (而且对于很多时候,Surface的大小是不会改变的,那么此函数就只在创建之初被调用一次而已)
    同样的,画图的手是必需的。
    另外值得注意的是,它告诉了我们这张纸有多高多宽。这点很重要。因为在onSurfaceCreated的时候我们是不知道纸的宽高的,

  • onDrawFrame

    好了,我们的初始化工作做得差不多了,那么现在就是该真刀真枪画画的时候了!
    此函数就是真正给你画画用的。每调用一次就画一幅图。可能的疑问是这个函数什么时候会被调
    用呢?最开始的时候肯定是会被调用的。以后会有两种模式供你选择:


    RENDERMODE_CONTINUOUSLY
    RENDERMODE_WHEN_DIRTY
    第一种模式(RENDERMODE_CONTINUOUSLY):
    连续不断的刷,画完一幅图马上又画下一幅。这种模式很明显是用来画动画的;


    第二种模式(RENDERMODE_WHEN_DIRTY):
    只有在需要重画的时候才画下一幅。这种模式就比较节约CPU和GPU一些,适合用来画不经常需要刷新的情况。
    多说一句,系统如何知道需要重画了呢?当然是你要告诉它……
    调用GLSurfaceView的requestRender ()方法,告诉它,你脏了。


    这两种模式在什么地方设置呢? GLSurfaceView的setRenderMode(int renderMode)方法。可以供你设置你需要的刷新模式。
    还是来看看这个函数的原型吧: public abstract void onDrawFrame (GL10 gl) 很简单,只有手。

GL10 版本1.0

详情介绍: https://blog.csdn.net/huachao1001/article/details/52044602

glClear(*)                          //GL清理
glViewport(0, 0, width, height)     //设置OpenGL场景的大小,(0,0)表示窗口内部视口的左下角,(w,h)指定了视口的大小
glClearColor();                     //设置清屏的颜色,参数分别对应RGBA
glMatrixMode()                      //指定改变的是投影矩阵模式
glLoadIdentity()                    //把“当前矩阵”复位
glFrustumf()                        //通过如下函数可将当前可视空间设置为透视投影空间
glOrthof()                          //可以通过如下函数设置正投影:
gl.glRotatef(30, 1, 0, 0);          //绕(1,0,0)向量旋转30度
gl.glTranslatef(1, 0, 0);           //沿x轴方向移动1个单位
gl.glScalef(0.1f, 0.1f, 0.1f);      //x,y,z方向放缩0.1倍
glEnableClientState()               //告诉 OpenGL,我们需要用到哪些数组(设置缓冲区之前要先告诉它)
glShadeModel()                      //设置着色器模式
glEnable()                          //开启相关功能。   
glDisable()                         //关闭相关功能。
glDepthFunc()                       //设置默认的“当前像素”z值
glVertexPointer()                   //设置数据缓冲
glColorPointer()                    //设定指向颜色数组的指针
glClearDepthf()                     //给深度缓存设定默认值。
glHint()                            //如果OpenGL在某些地方不能有效执行是,给他指定其他操作。
glDrawArrays()                      //绘制数组里面所有点构成的各个三角片。
  • glClear     //GL清理
参数可并列使用  ( | )
GLES20.GL_COLOR_BUFFER_BIT // 清除屏幕
GLES20.GL_DEPTH_BUFFER_BIT // 清除深度缓存
........

GLES20 版本2.0

详细介绍 https://blog.csdn.net/baipeng298/article/details/47255761
Shader : https://blog.csdn.net/matrix_laboratory/article/details/50897183

glClearColor                        //设置清屏的颜色,参数分别对应RGBA
glClear(*)                          //同 GL10
glCreateShader()                    //创造[顶点着色器]、[片元着色器]
glShaderSource()                    //加载着色器源代码
glCompileShader()                   //编译着色器
glGetShaderiv()                     //获取着色器的编译情况
glCreateProgram()                   //创建着色器程序
glAttachShader()                    //向程序中加入[顶点着色器][片元着色器]
glLinkProgram()                     //链接程序
glGetProgramiv()                    //获取program的链接情况
glGetAttribLocation()               //获取程序中 [顶点位置] [顶点颜色] 属性引用
glGetUniformLocation()              //获取程序中 [总变换矩阵] [位置、旋转变换矩阵] [光源位置] [摄像机位置] 引用
glUseProgram()                      //制定使用某套着色器程序
glUniformMatrix4fv()                //将 [总变换矩阵] [位置、旋转变换矩阵] 传入着色器程序
glUniform3fv()                      //将 [光源位置] [摄像机位置] 传入着色器程序
glVertexAttribPointer()             //将 [顶点位置数据] [顶点法向量数据] 传入渲染管线
glEnableVertexAttribArray()         //启用 [顶点位置数据] [法向量数据]
glDrawArrays()                      //绘制被加载的物体

Matrix 矩阵

参考自 https://blog.csdn.net/junzia/article/details/52817978

setLookAtM()                //设置相机位置
frustumM()                  //透视投影(物体离视点越远,呈现出来的越小。离视点越近,呈现出来的越大)
orthoM()                    //正交投影(物体呈现出来的大小不会随着其距离视点的远近而发生变化)  
multiplyMM()                //计算变换矩阵            

EffectFactory

SurfaceTexture  表面纹理

setOnFrameAvailableListener()   
updateTexImage()                        // 更新纹理

GLU

/**
* gl: GL10型变量
* eyeX,eyeY,eyeZ: 观测点坐标(相机坐标)
* centerX,centerY,centerZ:观察位置的坐标
* upX,upY,upZ :相机向上方向在世界坐标系中的方向(即保证看到的物体跟期望的不会颠倒)
*/
GLU.gluLookAt(gl,eyeX,eyeY,eyeZ,centerX,centerY,centerZ,upX,upY,upZ);

SurfaceTexture

https://blog.csdn.net/tq08g2z/article/details/77311938

setDefaultBufferSize(100, 100);             //设置默认缓冲区大小
surfaceTexture.setOnFrameAvailableListener();   //当一个新的缓冲区由生产者入对时,你的应用将通过回调 (onFrameAvailable()) 被通知
updateTexImage()                //这将释放之前持有的缓冲区,并从队列中获取新的缓冲区

Surface

new Surface(surfaceTexture);

ByteBuffer

猜你喜欢

转载自blog.csdn.net/binbin594738977/article/details/79994614
今日推荐