顶点着色器工作流程

Android使用OpenGL ES绘制2D图形并支持放大缩小 android opengl es_边距


片元着色器工作流程

Android使用OpenGL ES绘制2D图形并支持放大缩小 android opengl es_边距_02

OpenGL ES 2.0过程及理解:

  • 读取顶点数据 ——> 执行顶点着色器 ——> 组装图元 ——> 光栅化图元 ——> 执行片元着色器 ——> 写入帧缓冲区 ——> 显示到屏幕上
  • OpenGL作为本地库直接运行在硬件上,没有虚拟机,也没有垃圾回收或者内存压缩
  • 顶点着色器是针对每个顶点都会执行,是确定每个顶点的位置;片元着色器是针对每个片元都会执行的程序,确定每个片元的颜色
  • 着色器需要进行编译,然后链接到OpenGL程序中。一个OpenGL的程序就是把一个顶点着色器和一个片元着色器链接在一起变成单个对象

相关概念

  • 右手坐标系:屏幕中心为原点,从原点到屏幕边缘默认长度为1,向右为x轴正方向,向左为x轴负方向;向上为y轴正方向,向下为y轴负方向;垂直屏幕向上为z轴正方向,垂直屏幕向下为z轴负方向。
  • 正交投影:物体不会随距离观测点的位置而大小发生变化。
Matrix.orthoM(flaot[] m, int mOffset, float left, float right, float bottom, float top, float near, float far)
//m:接收正交投影的变换矩阵
//mOffset:变换矩阵的起始位置(偏移量)
//left:相对观察点近面的左边距
//right:相对观察点近面的右边距
//bottom:相对观察点近面的下边距
//top:相对观察点近面的上边距
//near:相对观察点近面距离
//far:相对观察点远面距离
  • 透视投影:距离观测点越远,物体越小,距离观测点越近,物体越大。
Matrix.frustumM(flaot[] m, int mOffset, float left, float right, float bottom, float top, float near, float far)
//m:接收透视投影的变换矩阵
//mOffset:变换矩阵的起始位置(偏移量)
//left:相对观察点近面的左边距
//right:相对观察点近面的右边距
//bottom:相对观察点近面的下边距
//top:相对观察点近面的上边距
//near:相对观察点近面距离
//far:相对观察点远面距离
  • 纹理映射:将2D的纹理映射到3D场景中的立体物体上。
  • 相近位置:相机在3D空间里的坐标点
  • 相机观察方向:表示相机镜头的方向
  • 相机UP方向:相机顶端指向的方向
Matrix.setLookAtM(float[] m, int rmOffset, float eyeX, float eyeY, float eyeZ, float centerX, float centerY, float centerZ, float upX, float upY, float upZ)
//m:接收相机变换矩阵
//rmOffset:变换矩阵的起始位置(偏移量)
//eyeX,eyeY,eyeZ:相机位置
//centerX,centerY,centerZ:观测点位置
//upX,upY,upZ:相机UP方向在xyz上的分量
  • 变换矩阵:通过参数设置,得到一个使用相机后顶点坐标的变换矩阵,和投影下的顶点坐标变换矩阵,还需要把矩阵传入给顶点着色器,在顶点着色器中用传入的矩阵乘以坐标的向量,得到实际展示的坐标向量。
Matrix.multiplyMM(float[] result, int resultOffset, float[] lhs, int lhsOffset, float[] rhs, int rhsOffset)
//result:接收相乘结果
//resultOffset:接收矩阵的起始位置(偏移量)
//lhs:左矩阵
//lhsOffset:左矩阵的起始位置
//rhs:右矩阵
//rhsOffset:右矩阵的起始位置
GLES2.0.glDrawArrays:顶点法,根据传入的顶点顺序进行绘制。第一个参数表示绘制方式,第二个参数表示偏移量,第三个参数表示顶点个数。
GLES2.0.glDrawElements:索引法,根据索引序列,在顶点序列中找到对应的顶点,并根据绘制方式,组成相应的图元进行绘制。
GL_POINTS:将传入的顶点坐标作为单独点绘制
GL_LINES:将传入的顶点作为单独线条绘制。ABCDEF六个顶点,绘制AB、CD、EF三条线
GL_LINE_STRIP:将传入的顶点作为折线绘制。ABCD四个顶点,绘制AB、BC、CD三条线
GL_LINE_LOOP:将传入的顶点作为闭合折线绘制。ABCD四个顶点,绘制AB、BC、CD、DA四条线
GL_TRIANGLES:将传入的顶点作为单独的三角形绘制。ABCDEF六个顶点,绘制ABC、DEF两个三角形
GL_TRIANGLE_FAN:将传入的顶点作为扇面绘制,ABCDEF六个顶点,绘制ABC、ACD、ADE、AEF四个三角形
GL_TRIANGLE_STRIP:将传入的顶点作为三角形带绘制,ABCDEF六个顶点,绘制ABC、BCD、CDE、DEF四个三角形
  • 标量:只有大小没有方向的量。在GLSL中标量只有bool、int、float
  • 向量:可以看作是数组,在GLSL通常用于存储颜色、坐标等数据,针对维数,可以分为二维、三维和四维,共有vec2、vec3、vec4、ivec2、ivec3、ivec4、bvec2、bvec3、bvec4。在GLSL中的向量表示竖向量,所以在与矩阵相乘进行变换时,矩阵在前,向量在后。
  1. 作为颜色向量时,用rgba表示分量
  2. 作为位置向量时,用xyzw表示分量
  3. 作为纹理向量时,用stpq表示分量
  • 矩阵:在GLSL中矩阵中拥有2X2、3X3、4X4三种类型的矩阵,分别用mat2、mat3、mat4表示
  • 采样器:是专门用来对纹理进行采样工作的,在GLSL中,一般来说,一个采样器标量表示一副或者一套纹理贴图。
  • 结构体:和C语言中的结构体相同,用struct来定义结构体
  • 数组:同C语言中相同
  • 空类型:用void表示,仅用来声明不返回任何值得函数
  • 限定符:
    attribute:一般用于各个顶点各不相同的量。如顶点、颜色、坐标等
    uniforms:一般用于对于3D物体中所有顶点都相同的量。如光源位置、统一变换矩阵等
    varying:表示易变量,一般用于顶点着色器传递到片元着色器的量
    const:常量
  • 在片元着色器中使用浮点型时,必须指定精度:
    lowp:低精度,8位
    mediump:中精度,10位
    highp:高精度,16位
  • 内建变量:相当于着色器硬件的输入和输出点,使用者利用这些输入点输入之后,就会看到屏幕上的输出
  • 顶点着色器输入变量:
    gl_Position:顶点坐标
    gl_PointSize:点的大小,没有赋值默认值为1
  • 片元着色器输入变量:
    gl_FragCoord:当前片元相对窗口位置所处的坐标
    gl_FragFacing:bool型,表示是否属于光栅化生成此片元对应图元的正面
  • 片元着色器输出变量
    gl_FragColor:当前片元颜色
    gl_FragData:vec4类型的数组,向其写入的信息,供渲染管线的后继过程使用
  • 纹理采样函数有texture2D、texture2DProj、texture2DLod、texture2DProjLod、texture3D、texture3DProj、texture3DLod、texture3DProjLod、textureCube、textureCubeLod,其中texture表示纹理采样,2D表示对2D纹理采样,3D表示对3D纹理采样,Lod后缀只适用于顶点着色器采样,Proj表示纹理坐标st会除以q