使用OpenGL绘制一个三角形和一个矩形,但对它们的数据使用不同的VAO和VBO,使用glad库与glfw库,vs2022c++语言 合理的顶点设置,确保三角形和矩形不会重叠
时间: 2024-10-29 08:16:32 浏览: 42
在使用OpenGL通过VS2022 C++以及glad和glfw库来绘制三角形和矩形时,我们需要分别处理VAO(Vertex Array Object)、VBO(Vertex Buffer Object)和顶点数据。首先,确保已经包含了GLFW、glaad和OpenGL库的头文件,并且初始化了窗口和GL上下文。
1. 定义顶点数据:
- 对于三角形,通常需要三个顶点,每个顶点包含坐标(x, y)和颜色(r, g, b)信息。例如:
```cpp
struct TriangleVertices {
float vertices[3][3]; // (x, y, r), (y, z, g), (z, x, b)
float colors[3][4]; // (r, g, b, a), etc.
};
```
- 矩形则需要更多的顶点,通常是四个顶点,构成两个三角形。
2. 创建VAO和VBO:
- 对于三角形和矩形,分别创建VAO和VBO。
```cpp
GLuint vao_triangle, vao_rectangle;
glGenVertexArrays(1, &vao_triangle);
glBindVertexArray(vao_triangle);
GLuint vbo_vertices_triangle, vbo_colors_triangle;
glGenBuffers(1, &vbo_vertices_triangle);
glBindBuffer(GL_ARRAY_BUFFER, vbo_vertices_triangle);
glBufferData(GL_ARRAY_BUFFER, sizeof(TriangleVertices.vertices), TriangleVertices.vertices, GL_STATIC_DRAW);
glGenBuffers(1, &vbo_colors_triangle);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, vbo_colors_triangle);
glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(TriangleVertices.colors), TriangleVertices.colors, GL_STATIC_DRAW);
// 矩形类似,只是顶点数据不同
GLuint vbo_vertices_rectangle, vbo_colors_rectangle;
...
```
3. 设置顶点属性和绘制命令:
- 在每个VAO下设置顶点属性,如位置和颜色:
```cpp
glEnableVertexAttribArray(0); // 位置索引0
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, sizeof(float)*6, (void*)offsetof(TriangleVertices, vertices));
glEnableVertexAttribArray(1); // 颜色索引1
glVertexAttribPointer(1, 4, GL_UNSIGNED_BYTE, GL_TRUE, sizeof(float)*12, (void*)offsetof(TriangleVertices, colors));
// 矩形的设置也类似
glBindVertexArray(0); // 清除当前VAO绑定
```
4. 分别绘制:
- 当需要渲染三角形时,绑定到三角形的VAO和VBO,然后调用`glDrawElements(GL_TRIANGLES, 3, GL_UNSIGNED_INT, 0)`。
- 类似地,对于矩形,先绑定其VAO和VBO,再调用`glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_INT, 0)`(假设矩形由两个三角形组成)。
5. 避免重叠:
- 为了防止重叠,你需要确保三角形和矩形的位置和尺寸合适,可以按需要调整它们的中心点坐标、宽度、高度等。如果你是在窗口内绘制,记得更新它们的位置相对于窗口的偏移。
阅读全文