OpenGL 从入门到成魔-第4章-VAO 和 VBO

2023-09-21 19:24:32 浏览数 (1)

注:参考自bilibili系列视频,OpenGL 从入门到成魔-第4章-VAO 和 VBO https://www.bilibili.com/video/BV1zt4y1C7dh

OpenGL中的坐标系

1.X轴方向,右; 2.Y轴方向,上; 3.Z轴方向,向屏幕内,Z轴值越小,离我们眼睛越近

image.png

落在这个立方体范围内的点可以显示出来,之外的就不显示。

构造三角形顶点

image.png

三角形三个顶点分别为 (0,1,0) (-1,-1,0) (1,-1,0)

VBO的函数调用

image.png

image.png

  1. glGenBuffers(1, &VBO) 生成一个buffer,VBO初始化,第一个参数是buffer数量,第二个是要初始化的VBO指针。
  2. glBindBuffer(GL_ARRAY_BUFFER, VBO); 第一个参数buffer类型,第二个参数是buffer。告诉openGL,当前操作的VBO是哪个
  3. glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW); 复制顶点数组到缓冲中供OpenGL使用
  4. glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 3 * sizeof(float), (void*)0); 告诉OpenGL该如何解析顶点数据(应用到逐个顶点属性上)
  • 第一个参数指定我们要配置的顶点属性。还记得我们在顶点着色器中使用layout(location = 0)定义了position顶点属性的位置值(Location)吗?它可以把顶点属性的位置值设置为0。因为我们希望把数据传递到这一个顶点属性中,所以这里我们传入0。
  • 第二个参数指定顶点属性的大小。顶点属性是一个vec3,它由3个值组成,所以大小是3。
  • 第三个参数指定数据的类型,这里是GL_FLOAT(GLSL中vec*都是由浮点数值组成的)。
  • 下个参数定义我们是否希望数据被标准化(Normalize),即归一化。如果我们设置为GL_TRUE,所有数据都会被映射到0(对于有符号型signed数据是-1)到1之间。我们把它设置为GL_FALSE。
  • 第五个参数叫做步长(Stride),它告诉我们在连续的顶点属性组之间的间隔。由于下个组位置数据在3个float之后,我们把步长设置为3 * sizeof(float)。

image.png

  • 最后一个参数的类型是void*,所以需要我们进行这个奇怪的强制类型转换。它表示位置数据在缓冲中起始位置的偏移量(Offset)。由于位置数据在数组的开头,所以这里是0。
  1. glEnableVertexAttribArray(layout); 以顶点属性位置值作为参数,启用顶点属性;顶点属性默认是禁用的。这里参数值应为0,因为在第三步中设置了将数据传递到位置为0的顶点属性中。顶点属性(Vertex Attribute)就是每个输入变量。
  2. glDeleteBuffers() 释放VBO

VAO

image.png

  1. glGenVertexArrays(1, &VAO) 创建
  2. glBindVertexArray(VAO) 绑定当前使用的VAO。由于OpenGL是个状态机,当绑定当前VAO之后,后面的VBO操作自然而然的都是在该VAO上进行的。
  3. glDeleteVertexArrays 释放VAO

0 人点赞