欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

OpenGLES 绘制三角形

程序员文章站 2024-02-20 23:29:52
...

OpenGLES 绘制三角形

需要用到OpenGLES ,所以在安卓开发的指导文档里学习。但是在学习第一个绘制三角形时,一切流程似乎都是对的,但是就是不能够正常绘制三角形,前后卡了**个钟,一开始对照官方文档每行代码一一排查都没有找到,休息了快两个钟,然后在CSDN找了一篇类似的教程Android OpenGL ES2.0(一):详细讲解如何绘制一个三角形,再一次鼓起勇气一一同样对比排查。终于发现原因所在:将着色器的类型设置错误,本应如下,应为“GL_VERTEX_SHADER”,但我依赖于自动输入又不检查,粗心大意,写成了“GL_SHADER_TYPE ”
OpenGLES 绘制三角形
顺便回忆一下,绘制图形的基本步骤。

基本步骤

1.GL_SurfaceView 一个view 本身空白,需要Render进行渲染,可以理解为一块画布
2.应用了GL_SurfaceView.Renderer接口的自定义渲染类,用于图形绘制。
应用此接口需要重写其中三个类

  • onSurfaceCreated 初始化,绘制三角形中,三角形对象将首先在此进行对象实例的创建。
  • onSurfaceChanged 当屏幕尺寸发生变化是调用,如竖屏转横屏。
  • onDrawFrame 绘制图像

三角形的绘制:

1.定义顶点坐标

  • 个数:3
  • 坐标:以浮点数组存储,每个点使用3个浮点数记录,分别为x,y,z
  • 颜色:RGBA格式,长度为4的浮点数组
  • 相应的着色器GLSL代码,具体使用查阅文档此处应有顶点着色的vertexShader与用于颜色着色的fragmentShader

2.初始化

此处代码在onSurfaceCreated中使用,因为绘制的图形多样,安卓建议建立图形类,通过调用构造函数进行,三角形的初始化包括:

  • 将顶点浮点数组转为浮点缓存类FloatBuffer,以提高效率
  • 建立空白的编译程序mProgram =GLES20.glCreateProgram,将着色程序字段添加至其中。然后注册关联

绘制

此处代码在onDrawFrame中使用,此处调用三角形类的draw函数,包括:

  • 使用初始化阶段定义的mProgram
  • 定义位置句柄与颜色句柄,取出编译的程序mProgram中的位置变量与颜色变量。
  • 启动句柄,赋值,绘制。

OpenGLES 绘制三角形

增加投影与相机

保证屏幕旋转时比例正常

  • 设置相机格式 onDrawFrame
        Matrix.setLookAtM(viewMatrix, //接受相机变换矩阵
                0,            //变换矩阵的起始位置,偏移量
                0,0,-3,//相机位置
                0f,0f,0f,//观测点位置
                0f,1.0f,0.0f//相机顶端方向
                );

-设置投影格式 onSurfaceChanged

        Matrix.frustumM(projectionMatrix ,//接受投影的矩阵,可以理解为投影的位置设置
                0,                  //变换矩阵的起始位置(偏移量)
                -ratio,ratio,-1,1,//相对观察点的左右下上四个方向距离
                3,7             //相对观察点的近面与远面距离
        );

  • 相机与投影矩阵相乘,得到变换时的数据样版
Matrix.multiplyMM(vPMatrix,0,projectionMatrix,0,viewMatrix,0);

        mTriangle.draw(vPMatrix);
  • 获取句柄,进行渲染
        vPMatrixHanle = GLES20.glGetUniformLocation(mProgram,"uMVPMatrix");
        GLES20.glUniformMatrix4fv(vPMatrixHanle,1,false,mvpMatrix,0);

OpenGLES 绘制三角形

本博文纯粹记录,本身为菜鸟,如有不对,欢迎指正。