1.Opengl渲染管线:
以绘制一个sprite为例,传入一个图片和4个顶点,将顶点数据(主要是三个属性)放入缓冲区
顶点处理(vertex shader),对顶点进行坐标转换(矩阵是通过uniform传入的)
片元组装,点,线,三角形。上面一个spirte可以装成2个三角形
光栅化,将上面的顶点插值形成计算机可以显示的二维像数
像数处理(fragment shader),通常是采样纹理颜色和顶点颜色叠加
各种测试,混合,抖动
进入帧缓冲
2.Opengl渲染管线都是在GPU执行的
3.Vertex shader
顶点属性最大数量不少于8个
输入:
Attributes
Uniforms,可支持的最大数量不少于16个
Samplers,特殊的uniform
输出:
内建变量:gl_Position,2个可选变量:gl_FrontFacing,gl_PointSzie
Varying变量,可支持的最大数量不少于8个。会在光栅化的时候被线性插值
4.fragment shader
输入:
varying变量
uniform
Samplers
输出:内建变量gl_fragcolor
5.glfwSwapBuffers:双缓冲机制下交换缓冲区指针,并强制绘制,通常使用双缓冲。默认是单缓冲,单缓冲通过
glFlush强制绘制。
6.glGenBUffers:创建缓冲区
7.glBindBuffer:与缓冲区绑定,激活缓冲区
8.glBufferData:分配和初始化缓冲区对象
9.glClear(CL_COLOR_BUFFER_BIT|GL_DEPTH_BUFFER_BIT);清除颜色缓冲和深度缓冲区
10.glGenTextures(GLsizei n,GLuint *textures);根据传入参数生成纹理索引。
11.bindTexture2D(,GLuint textureId),改变opengl状态,告诉opengl接下来的操作都是针对他所绑定的纹理
12.glTexParameteri,设置纹理过滤。即将图像从纹理空间映射到帧缓冲图像空间,纹理大小和显示的大小不匹配的时候,纹理重新构造的方法。GL_TEXTURE_MAG_FILTER放大过滤,
GL_TEXTURE_MIN_FILTER缩小过滤。
GL_TEXTURE_WRAP_S s方向上的贴图模式
GL_TEXTURE_WRAP_T t方向上的贴图模式
13.glTexImage2D(….)生成纹理,一般会先在内存把纹理数据做好,然后马上送到显存,有的驱动是在draw的时候才推到显存的。
14.shader其实是显卡的功能,就是利用GPU去处理像数处理。是在一开始就设置好的。在draw之前调用glUseProgram(program),加载shader,(glUseProgram(NULL)可以卸载shader)。
15.VBO:顶点缓冲对象,是在显存里面开辟的一段空间,用来缓冲定点
VAO:顶点数组对象,包含一个或多个VBO,记录绘制信息
16.Vertex shader顶点着色器传参过程
首先与缓冲区绑定glBindBuffer
填入数据glBufferData
指定顶点属性,包括顶点坐标,顶点颜色,纹理坐标
17.颜色相加:指的是光的叠加,物理上是光的强度的相加
颜色相乘应该理解为颜色的非等比缩放
另一种说法:不同光源的结果是相加的,而光源作用在材质上就是相乘
18.混合:glDisable(GL_BLEND) glEnable(GL_BLEND)开启或者关闭混合
glBlendFunc()指定混合函数
19.UV动画。UV坐标指的是纹理贴图到片元顶点上面的坐标(就是纹理坐标)。UV动画指的是改变纹理坐标得到的动画。一般可用来做水波纹。(网上的例子是在fragshader里面对坐标进行变化)
20.GluReshapeFunc是窗口改变的时候调用的函数。GluDisplayFunc是显示的时候调用的
21.Rasterize(光栅化):
这个词儿Adobe官方翻译成栅格化或者像素化。没错,就是把矢量图形转化成像素点儿的过程。我们屏幕上显示的画面都是由像素组成,而三维物体都是点线面构成的。要让点线面,变成能在屏幕上显示的像素,就需要Rasterize这个过程。就是从矢量的点线面的描述,变成像素的描述。
22.三次贝塞尔曲线是由4个点控制的,二次贝塞尔曲线是由3个点控制的