2 Hello Triangle
个人觉得这一节的理解是最为重要的,包括了对着色器以及 VBO,VAO 机制的理解。
着色器¶
着色器由OpenGL着色器语言(GLSL)来写,相应的图形渲染管线为
主要关注顶点着色器与片段着色器,其他着色器的作用直接看文章即可。顶点着色器的作用是配置顶点属性,而片元着色器是计算每个像素点的颜色。我认为这里每个片元都通过顶点属性进行插值了,根据每个点的信息计算每个像素的颜色。
VBO与VAO¶
VBO 为顶点缓冲对象,我们通过 glGenBuffers(1, &VBO_ID);
生成一个拥有独特 ID(VBO_ID
)的 VBO 对象,然后将其绑定到缓冲类型 GL_ARRAY_BUFFER
上,然后相当于现在任何对于 GL_ARRAY_BUFFER
的操作都是对 VBO 的操作。接着调用 glBufferData
函数就可以将数据复制到缓冲的内存中。
在这里我再表述一下我的理解,注意实际上将数据放入显存的函数是 glBufferData
然后这个函数的第一个参数是目标缓冲的类型,而这仅仅只是一个类型,如果不绑定 VBO,那么我并不知道数据应该放到哪里去,所以在调用该函数之前我应该将这个类型与我之前创建的 VBO 绑定,这样 glBufferData
就知道数据应当放到那里去了。【当然这里我的理解可能有误,随着学习的深入,对这个的理解会更深】
现在只是将数据放到了显存中,但是只是数据,显卡并不知道怎么使用它们,所以我们需要有东西去解释 VBO,这里我们就引入了 VAO。
VAO 即顶点数组对象,我们创建 VAO 来解释 VBO,整个过程如下
创建 VAO 的过程与创建 VBO 的过程类似,得到了一个具有独一无二ID的 VAO
使用 glBindVertexArrays
绑定VAO,之后的操作就对应于该 VAO了。相应的操作如下,设置顶点属性指针。
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 3 * sizeof(float), (void*)0);
glEnableVertexAttribArray(0);
上图是VAO管理VBO的模式图,VAO中包含了顶点属性指针,以 VAO 2 为例,指针0指向的就是位置这个信息,指针1指向的就是颜色这个信息。而当我们打算绘制一个物体的时候,我们只需要绑定相应的 VAO 就可以了。我们的着色器程序
就可以根据 VAO 中的指针解析 VBO 中的数据以得到相应的位置与颜色信息。EBO的相关机制类似,直接看文章即可。