c++ Shader opengl 画网格
时间: 2023-12-08 16:05:55 浏览: 69
OPENGL 画网格
要在 OpenGL 中绘制网格,需要使用顶点缓冲对象(VBO)和索引缓冲对象(IBO)来存储顶点和面的数据。以下是一个简单的示例:
首先,定义一个顶点结构体和一个顶点数组:
```
struct Vertex {
glm::vec3 position;
glm::vec3 color;
};
std::vector<Vertex> vertices;
```
然后,创建一个 VBO 并将顶点数据绑定到它上面:
```
GLuint vbo;
glGenBuffers(1, &vbo);
glBindBuffer(GL_ARRAY_BUFFER, vbo);
glBufferData(GL_ARRAY_BUFFER, vertices.size() * sizeof(Vertex), vertices.data(), GL_STATIC_DRAW);
```
接下来,定义一个索引数组来存储网格面的顶点索引:
```
std::vector<GLuint> indices;
```
将索引数据绑定到 IBO 上:
```
GLuint ibo;
glGenBuffers(1, &ibo);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, ibo);
glBufferData(GL_ELEMENT_ARRAY_BUFFER, indices.size() * sizeof(GLuint), indices.data(), GL_STATIC_DRAW);
```
最后,绘制网格:
```
glEnableVertexAttribArray(0);
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, sizeof(Vertex), (void*)offsetof(Vertex, position));
glEnableVertexAttribArray(1);
glVertexAttribPointer(1, 3, GL_FLOAT, GL_FALSE, sizeof(Vertex), (void*)offsetof(Vertex, color));
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, ibo);
glDrawElements(GL_TRIANGLES, indices.size(), GL_UNSIGNED_INT, 0);
glDisableVertexAttribArray(0);
glDisableVertexAttribArray(1);
```
在上述代码中,我们首先启用顶点属性,并将位置和颜色属性绑定到顶点数组上。然后绑定 IBO,并使用 glDrawElements 函数绘制网格。最后禁用顶点属性。
这是一个简单的示例,实际应用中还需要考虑更多的细节,比如顶点法线、纹理坐标等。
阅读全文