状态机

可以理解为一个保存对象当前状态,且可以根据输入修改当前状态进行响应的机器
特点

  • 记忆功能:保存当前状态(如使用颜色、混合功能是否开启等)
  • 接收输入:根据输入修改当前状态,且有相应输出
  • 进入停机状态时,不再接受输入,且停止工作

    上下文 Context

  • 一个保存OpenGL中各种状态的庞大状态机,

  • 是OpenGL指令执行的基础,需要在调用指令之前创建

OpenGL函数 与 上下文

  • 不论何种语言,OpenGL函数都是面向过程的函数
  • 函数本质:对context中某个状态/对象进行操作
  • 可以通过对OpenGL指令的封装,将OpenGL的相关函数调用封装成一个面向对象的图形API

问题:反复上下文切换/大量修改渲染状态,导致GPU开销较大

  • 针对不同模块,创建不同的context进行状态管理,context之间共享纹理、缓冲区等资源

顶点数组 VertexArray、顶点缓冲区 VertexBuffer

顶点:绘制图形时顶点位置的数据
OpenGL ES中的图元类型
屏幕中的所有图形/图像,都是由这三种图元组合而成的

  • 线
  • 三角形

顶点数据存储方式
顶点数组与顶点缓冲区的区别在于顶点数据的存储方式不同

  • 存储在内存中,即 【顶点数组】
  • 存储在GPU提前分配的显存中,即 【顶点缓冲区】

管线

可以理解为流水线,该流水线有一个固定顺序的操作,需要按着这个顺序一个个执行
固定管线/存储着色器

  • 一个已经封装好的Shader程序,开发者使用时,只需要传入相应参数,即可快速完成渲染,类似苹果系统中封装好的API
  • 当固定管线无法完成每个业务时,需要将与业务相关的部分变成可编程,用户根据需要自定义管线来完成业务
  • 目前OpenGL中可编程的仅有两个程序:顶点着色器、片元着色器

顶点着色器

  • OpenGL中用来处理顶点相关代码的程序
  • 将顶点坐标由 自身坐标系 转换到 归一坐标系
  • 是逐顶点运行的程序,即每个顶点数据都会执行一次,且是并行的

操作

  • 确定顶点位置
  • 处理图形顶点的变换(旋转、平移、缩放)
  • 3D图形数据 投影换算 为2D图形数据

    片元着色器

  • 片元:理解为屏幕中的像素点

  • 片元着色器主要用于处理一个个的像素点,例如像素颜色的计算和填充
  • 逐像素且在GPU并行运行的程序,即每个像素都会执行一次

举例说明:图片饱和度是如何完成的?

  • 通过片元着色器进行一个个像素点的修改来实现

参考链接