glBufferData
时间: 2024-04-16 07:26:40 浏览: 135
glBufferData是OpenGL中的一个函数,用于为指定的缓冲区对象分配内存并初始化数据。
它的函数原型为:
```
void glBufferData(GLenum target, GLsizeiptr size, const void* data, GLenum usage);
```
参数解释:
- target:指定要分配内存并初始化数据的缓冲区对象类型,如GL_ARRAY_BUFFER、GL_ELEMENT_ARRAY_BUFFER等。
- size:指定要分配的缓冲区对象的大小,以字节为单位。
- data:指定要初始化缓冲区对象的数据指针,可以为NULL。
- usage:指定缓冲区对象的使用方式,如GL_STATIC_DRAW、GL_DYNAMIC_DRAW等。
该函数会将指定大小的内存分配给缓冲区对象,并将data中的数据复制到分配的内存中。usage参数可以用于指定缓冲区对象的使用方式,以便OpenGL优化内存使用和访问模式。
注意,glBufferData函数会覆盖之前分配给缓冲区对象的内存,如果之前有数据需要保留,可以使用glBufferSubData或glMapBufferRange函数来更新数据。
相关问题
glBufferData()使用方法
glBufferData() 是OpenGL中用于创建和初始化一个缓冲区对象的函数,它的原型如下:
```
void glBufferData(GLenum target, GLsizeiptr size, const void * data, GLenum usage);
```
参数含义如下:
- target:指定缓冲区对象的类型,可以是 GL_ARRAY_BUFFER、GL_ELEMENT_ARRAY_BUFFER、GL_UNIFORM_BUFFER、GL_TEXTURE_BUFFER 等。
- size:指定缓冲区对象的大小,以字节为单位。
- data:指向要拷贝到缓冲区对象中的数据的指针。可以设置为 NULL,表示仅分配空间,但不进行初始化操作。
- usage:指定缓冲区对象的使用方式,可以是 GL_STATIC_DRAW、GL_DYNAMIC_DRAW、GL_STREAM_DRAW 等。
具体使用方法如下:
1. 创建缓冲区对象
```
GLuint buffer;
glGenBuffers(1, &buffer);
```
2. 绑定缓冲区对象
```
glBindBuffer(GL_ARRAY_BUFFER, buffer);
```
3. 分配空间并初始化数据
```
float vertices[] = { 0.0f, 0.5f, 0.0f, -0.5f, -0.5f, 0.0f, 0.5f, -0.5f, 0.0f };
glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW);
```
4. 解绑缓冲区对象
```
glBindBuffer(GL_ARRAY_BUFFER, 0);
```
以上代码创建了一个包含三个顶点坐标的缓冲区对象,并将数据拷贝到了缓冲区中。其中,GL_ARRAY_BUFFER 表示缓冲区对象用于存储顶点数据。
如果需要更新缓冲区对象的数据,可以使用 glBufferSubData() 函数。如果需要删除缓冲区对象,可以使用 glDeleteBuffers() 函数。
void drawSquareAnnulus() { // Bind vertex buffer and reserve space. glBindBuffer(GL_ARRAY_BUFFER, buffer[VERTICES]); glBufferData(GL_ARRAY_BUFFER, sizeof(vertices) + sizeof(colors), NULL, GL_STATIC_DRAW); // Copy vertex coordinates data into first half of vertex buffer. glBufferSubData(GL_ARRAY_BUFFER, 0, sizeof(vertices), vertices); // Copy vertex color data into second half of vertex buffer. glBufferSubData(GL_ARRAY_BUFFER, sizeof(vertices), sizeof(colors), colors); // Bind and fill indices buffer. glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, buffer[INDICES]); glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(stripIndices), stripIndices, GL_STATIC_DRAW); glVertexPointer(3, GL_FLOAT, 0, 0); glColorPointer(3, GL_FLOAT, 0, (void*)(sizeof(vertices))); }将上述代码改成绘制圆形的
要绘制圆形,可以使用三角扇或三角形条带来逼近圆形。以下是使用三角扇绘制圆形的示例代码:
```
void drawCircle() {
const int numSegments = 32; // 圆形的线段数
const float radius = 1.0f; // 圆形半径
// 顶点坐标和颜色数组
GLfloat vertices[(numSegments + 2) * 3];
GLfloat colors[(numSegments + 2) * 3];
// 圆心点
vertices[0] = 0.0f;
vertices[1] = 0.0f;
vertices[2] = 0.0f;
colors[0] = 1.0f;
colors[1] = 1.0f;
colors[2] = 1.0f;
// 计算圆周上的点的坐标和颜色
for (int i = 0; i <= numSegments; i++) {
float angle = i * 2.0f * M_PI / numSegments;
int offset = (i + 1) * 3;
vertices[offset] = cos(angle) * radius;
vertices[offset + 1] = sin(angle) * radius;
vertices[offset + 2] = 0.0f;
colors[offset] = 1.0f;
colors[offset + 1] = 1.0f;
colors[offset + 2] = 1.0f;
}
// 绘制三角扇
glBindBuffer(GL_ARRAY_BUFFER, buffer[VERTICES]);
glBufferData(GL_ARRAY_BUFFER, sizeof(vertices) + sizeof(colors), NULL, GL_STATIC_DRAW);
glBufferSubData(GL_ARRAY_BUFFER, 0, sizeof(vertices), vertices);
glBufferSubData(GL_ARRAY_BUFFER, sizeof(vertices), sizeof(colors), colors);
glVertexPointer(3, GL_FLOAT, 0, 0);
glColorPointer(3, GL_FLOAT, 0, (void*)(sizeof(vertices)));
glDrawArrays(GL_TRIANGLE_FAN, 0, numSegments + 2);
}
```
注意到圆形的顶点数是固定的,因此在画圆形时不需要使用索引缓冲区。在顶点坐标和颜色数组中,第一个顶点是圆心,其它顶点按逆时针顺序排列在圆周上。最后使用 `glDrawArrays` 函数绘制三角扇即可。
阅读全文