优秀博客
https://mubu.com/doc/CJSil5TLHm
疑难问题:
https://docs.qq.com/sheet/DVHd1WWNrUXpVekJJ?tab=BB08J2
OpenGL 名词:
Context上下文:状态机(机器)。OpenGL指令基础、记录功能是否打开。不同线程可创建不同上下文,共享纹理、缓冲区等资源。
渲染: 图片/按钮/视频 -> 绘制到屏幕的过程 解码图片->渲染到屏幕。
顶点数组: OpenGL没有正方形,存储到内存之中成为顶点数组。只支持点、线、三角形,正方形是由两个三角形组合成的,所以正方形有六个顶点。顶点数据存到内存中,GPU调度存在《带宽》问题。
顶点缓存区: 如果要GPU快速调度顶点数据,顶点数据存储到GPU的显存中。
内存 CPU 有一级二级三级缓存 ,GPU显存!
(显示前提将png图片解压成位图!png、jpg都是压缩图片)
位图: 120120 = 14400(像素点) ->RGBA存储->144004(字节)->位图(纹理)。
映射: 对应关系。
管线: 流水线 :肥皂水 - 模具 - 肥皂块。
固定管线: 对应非常多模具(固定着色器),形成结果。肥皂水 - 模具( 对应模具/固定着色器) - 肥皂块。
可编程管线: 修改系统api。肥皂水 - 模具(自定义变成模具GLSL语法驱使GPU) - 肥皂块。
着色器: 函数/方法供CPU使用,着色器shader(代码块)供GPU使用。着色器就是方法
固定着色器: 也称存储着色器,苹果API,只能调用,由OpenGL提供。
自定义着色器: 可以进行自定义(自己基于GLSL语法编写代码段)
顶点着色器: 用来处理顶点相关的代码,1、确定位置。2、缩放、偏移、旋转。3、手机屏幕为2D,显示3D,3D->2D经过投影换算。
片元/像素 着色器: 片元(像素点),处理一个一个像素点,120*120 要处理14400次,GPU并行运算。(如果是CPU则麻烦)
片元着色器拓展:图片饱和度调整,需要片元着色器怼像素点一个一个修改。
其他的着色器(几何、曲面细分)自定义不了
能自定义的着色器仅有两个:顶点着色器、片元着色器。
GSLS: GPU只认GLSL语言/shading language(OpenGL标准)
光栅化: 顶点数据转化为片元数据。两个过程(不可编程)图源装配 1、确定图形在像素的范围;2、颜色附着。
顶点着色器处理顶点、片元着色器处理像素。
纹理: 多数指图片,压缩图片(.png)转化为位图 .tga,在OpenGL移动端中png转位图。
混合: Layer。 2个图层 粉红色0.5、 蓝色0.2,叠加通过混合计算,组透明度会触发离屏渲染。
变换矩阵: 评议、旋转、缩放(《线性代数》、《3D数学》)
投影矩阵: 3D图形转换为二维坐标
渲染上屏/交换缓冲区:
2D笛卡尔坐标: x、y
3D笛卡尔坐标系: x、y、z
视口: 坐标系对应屏幕区域的范围,可设置 代码:glViewport
投影方式: 有且只有两种 1、正(平行)投影,无论远近1:1投影;2、透视投影,远小近大
摄像机坐标系: 观察点坐标系
物体坐标系: 物体本身坐标
最终得到规范坐标系!
顶点数据->顶点着色器->细分着色器->几何着色器->图元设置->剪切->光栅化->片元着色器->效果
OpenGL:面向过程
GLSL语法
GLKit框架
OpenGL渲染流程
Metal:略