glVertexPointer
时间: 2023-11-15 12:06:03 浏览: 134
glVertexPointer是OpenGL中的一个函数,它用于告诉OpenGL如何解释顶点数组中的数据。函数原型如下:
```
void glVertexPointer(GLint size, GLenum type, GLsizei stride, const GLvoid *pointer);
```
参数说明:
- size:每个顶点的坐标分量数,可以是2,3或4。例如,二维坐标需要设置为2,三维坐标需要设置为3。
- type:每个分量的数据类型,可以是GL_BYTE、GL_SHORT、GL_INT、GL_FLOAT或GL_DOUBLE等。
- stride:相邻两个顶点之间的字节数,如果数据是紧密排列的,则设置为0。
- pointer:指向顶点数据的指针,如果使用顶点数组,则指向数组的第一个元素。
使用glVertexPointer函数之后,我们就可以通过其他OpenGL函数来绘制各种形状了,例如glDrawArrays和glDrawElements等函数。
相关问题
// Draw spiral inside the triangle using VBO glBindBuffer(GL_ARRAY_BUFFER, spiralVBO); glEnableClientState(GL_VERTEX_ARRAY); glVertexPointer(3, GL_FLOAT, 0, nullptr); glDrawArrays(GL_LINE_STRIP, 0, spiralVertices.size() / 3); glDisableClientState(GL_VERTEX_ARRAY);
这段代码的作用是使用VBO在三角形内部绘制螺旋线。首先,通过函数glBindBuffer将VBO绑定到OpenGL的顶点数组缓冲区上。然后,启用顶点数组并设置指针,告诉OpenGL如何解释缓冲区中的数据。接下来,使用glDrawArrays函数绘制线段,其中GL_LINE_STRIP表示绘制一系列连接的线段,顶点数量为spiralVertices.size() / 3。最后,禁用顶点数组并解绑VBO。
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` 函数绘制三角扇即可。
阅读全文
相关推荐














