1.渲染管线
1)将顶点保存到缓存对象
将顶点数据保存到OpenGL管理的一块内存中
2)发送到OpenGL服务端
调用绘制命令如glDrawArrays()
3)顶点着色器
4)细分着色器
5)几何着色器
6)图元装配
7)剪切(clipping)
8)光栅化
9)片元着色器
10)逐片元操作
深度测试、模板测试
写入帧缓存(若开启融混则以叠加的方式写入)
2.着色器
1)矩阵是列主序的
先填充列,再填充行
mat3 M1 = mat3(1.0, 2.0, 3.0,
4.0, 5.0, 6.0,
7.0, 8.0, 9.0);
vec3 column1 = vec3(1.0, 2.0, 3.0);
vec3 column2 = vec3(4.0, 5.0, 6.0);
vec3 column3 = vec3(7.0, 8.0, 9.0);
mat3 M2 = new mat3(column1, column2 ,column3);
M1 == M2
2)流程控制语句
break
continue
return
discard 丢弃当前片元,立即终止着色器(只在片元着色器中使用)
3)计算的不变性?
invariant
precise
4)UBO
uniform块
5)SSBO
(shader storage buffer object)
buffer 块(可读写,动态大小)
6)in/out
7)着色器子程序
函数指针
3.绘制前的数据准备
1)VBO
vertex buffer object
仅使用VBO的绘制流程如下:
–绑定VBO
–调用glBufferData()放入顶点数据
–调用glVertexAttribPointer()告诉openGL放入的顶点数据中哪些是位置信息,哪些是颜色信息,哪些是纹理坐标等等
// …:: 绘制代码(渲染循环中) ::
–绑定VBO
–调用glVertexAttribPointer()配置顶点信息
–开始绘制
每绘制一个物体都都需要先绑定VBO,然后告诉OpenGL这些数据分别是代表哪些信息。比较麻烦
2)VAO
将VBO和顶点属性配置打包,每次绘制只用绑定VAO就好了。
使用VAO流程如下:
–绑定VAO
–绑定VBO
–调用glBufferData()放入顶点数据
–调用glVertexAttribPointer()告诉openGL放入的顶点数据中哪些是位置信息,哪些是颜色信息,哪些是纹理坐标等等
// …:: 绘制代码(渲染循环中) :: …
–glBindVertexArray(VAO);
–开始绘制
3)EBO
使用索引,去除重复顶点
使用EAO流程如下:
–绑定VAO
–绑定VBO
–调用glBufferData()放入顶点数据
–绑定EBO
–调用glBufferData()放入索引数据
–调用glVertexAttribPointer()告诉openGL放入的顶点数据中哪些是位置信息,哪些是颜色信息,哪些是纹理坐标等等
// …:: 绘制代码(渲染循环中) :: …
–glBindVertexArray(VAO);
glDrawElements();