详解GPU的工作流程
1.shader通常称为着色器,作用是把CPU上的点渲染出来。
2.shader是并行的。
3.流程:数据data (顶点数据) ----->VS(输入:data的顶点数据,输出:gl_Position的 vec4 顶点数据)----->光栅化处理(显卡自动负责,把点连成生成面,其中包括一定像素)------>FS(输入:光栅器的输出的像素,输出画面);注意VS和FS点会同时被并行执行,多个点可以同时处理。
最简单的Shader代码
1.Vertext shader (顶点着色器)
attribute vec4 position; //vec4是齐次坐标
uniform mat4 U_ModelMatrix; //mat4是4x4矩阵 ,模型矩阵需要从C++传递过来
uniform mat4 U_ViewMatrix; //视口矩阵需要从C++传递过来
uniform mat4 U_ProjectionMatrix; //投影矩阵需要从C++传递过来
void main(){//自右向左,模型空间下的点-》世界坐标系-》视口矩阵转到视口空间,摄像机看到的带你-》屏幕空间gl_Position=U_ProjectionMatrix*U_ViewMatrix*U_ModelMatrix*position;
}
2.Fragment shader (片元着色器)
void main(){gl_FragColor=vec4(1.0,1.0,1.0,1.0); //gl_FragColor是输出点的颜色
}
VBO和VAO函数的区别
1.向Vertext shader中传输顶点数据时,需要使用VBO是用来加载CPU上的相关顶点数据
GLuint vbo;//vertex buffer object 存放顶点缓冲区的对象glGenBuffers(1,&vbo);//需要1个VBO,把vbo写入到显卡进去,供后续操作glBindBuffer(GL_ARRAY_BUFFER,vbo);//把vbo设置的奥卡槽上//glBufferData(GL_ARRAY_BUFFER,sizeof(Vectice)*3, nullptr,GL_STATIC_DRAW);//只在GPU上开辟内存不传数据//glBufferSubData(GL_ARRAY_BUFFER,0,sizeof(Vectice)*3,vertices);//加入数组,0指vbo偏移位置glBufferData(GL_ARRAY_BUFFER,sizeof(Vectice)*3,vertices,GL_STATIC_DRAW);//cpu -> gpu,向GL_ARRAY_BUFFER加入数据glBindBuffer(GL_ARRAY_BUFFER,0);//卡槽重新绑定,防止误操作
2.多个VBO的集合称为VAO
Shader如何传入顶点坐标
详解Attribute和Uniform关键字
1Uniform,使用的一些变量都是一样的使用Uniform。
2.Attribute,随着属性组变化使用Attribute。
3. OPenGLES2.0最多支持8个属性组,3.0支持16个。
详解3D渲染管线
1.MVP(M,模型矩阵;V,视口矩阵;P,投影矩阵)
自右向左,模型空间下的点-》世界坐标系-》视口矩阵转到视口空间,摄像机看到的带你-》屏幕空间