GLSL通过 vertex shader来处理每一个顶点的数据,例如确定顶点在模型变换,视图变换,投影变换后的空间坐标,纹理坐标,光线参数等。
vertex shader的代码运行在GPU上,相当于每一个GPU为每个顶点数据单独开一个线程来执行vertex shader,进行并行计算。
vertex shader需要两种基本的输入数据,一种是初始化后的各个顶点的原始空间坐标,这种变量用in 修饰,称为Attribute。Attribute除了包含顶点坐标,还可以包含其他信息,例如温度,密度等根据具体应用场景而定的一些属性,还可以包括纹理坐标,法向量等。需要让每一个vertex shader线程能够找到它要处理的顶点的相关Attribute,这个过程一般在OpenGL 的init 过程中实现,步骤为:
1,创建一个顶点数组对象VAO, VAO 用来管理顶点数组。调用函数glGenVertexArrays()和glBindVertexArray();
2,创建一个VERTEX_ARRAY_BUFFER,对buffer进行初始化,里面存储了顶点的Attribute等相关信息。调用glGenBuffers 和glBindBuffer,并且通过glBufferData() 初始化。
3,利用属性的索引值,调用使相应的顶点属性数组可用:glEnableVertexAttributeArray(),并且利用索引值指定该属性对应的buffer的位置。
4,如果要调用DrawElement来使用顶点的索引绘制,还需要创建一个GL_ELEMENT_ARRAY_BUFFER。
在绑定或激活顶点数组对象以后,接下来所开辟的Attribute Buffer 由该顶点数组对象管理。
代码示例:
glGenVertexArrays(1, &vaoID);
glGenBuffers(1, &vboVerticesID);
glGenBuffers(1, &vboIndicesID);
&n