如何用VBO绘制三角形?

时间:2012-06-15 03:29:23

标签: c windows opengl vbo

我想让我的VBO画画,但我看不到任何东西。我试图绘制一个三角形(在我看来,一个三角形是正确方向的良好开端)。一切都在不破坏的情况下编译和运行。

void initGraphics(int width, int height) {
    glViewport(0, 0, width, height);
    glEnable(GL_TEXTURE_2D);
    glEnable(GL_BLEND);
    glDisable(GL_DEPTH_TEST);
    glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
    glClearColor(1.0, 1.0, 1.0, 1.0);
    glMatrixMode(GL_PROJECTION);
    glLoadIdentity();
    gluOrtho2D(0.0, width, height, 0.0);
    glMatrixMode(GL_MODELVIEW);
}

GLuint vboId;

void initVbo(void) {
    GLsizei dataSize;
    GLfloat* vertices;
    int vCount = 3;

    dataSize = sizeof(GLfloat) * 3 * vCount;

    vertices = (GLfloat*)malloc(dataSize);

    vertices[0] = 0;
    vertices[1] = 0;
    vertices[2] = 0;

    vertices[3] = 100;
    vertices[4] = 0;
    vertices[5] = 0;

    vertices[6] = 100;
    vertices[7] = 100;
    vertices[8] = 0;

    glewInit();

    glGenBuffersARB(1, &vboId);

    glBindBufferARB(GL_ARRAY_BUFFER_ARB, vboId);

    glBufferDataARB(GL_ARRAY_BUFFER_ARB, dataSize, vertices, GL_STATIC_DRAW_ARB);

    free(vertices);

    //glDeleteBuffersARB(1, &vboId); // edit #1
}

unsigned int indices[] = { 0, 1, 2 }; // edit #3

void drawVbo(void) {

    glClear(GL_COLOR_BUFFER_BIT);
    glClearColor(1.0, 1.0, 1.0, 1.0);

    glBindBufferARB(GL_ARRAY_BUFFER_ARB, vboId);

    glEnableClientState(GL_VERTEX_ARRAY);
    glVertexPointer(3, GL_FLOAT, 0, 0);
//edit #1, #2
    glDrawElements(GL_TRIANGLES, 3 /*1*/, /*GL_UNSIGNED_BYTE*/ GL_UNSIGNED_INT, &indices);

    glDisableClientState(GL_VERTEX_ARRAY);

    glBindBufferARB(GL_ARRAY_BUFFER_ARB, 0); 
}

这些是被调用的函数。我在Windows上运行,我避免发布一堆与Windows相关的代码......

编辑#1

修改代码以反映genpfault的建议。

编辑#2

修改代码以反映Nicol Bolas的建议。

评论#1

以下代码有效(仅用于证明投影设置正确):

glBegin(GL_TRIANGLES);
glVertex3f(0.0, 0.0, 0.0);
glVertex3f(100.0, 0.0, 0.0);
glVertex3f(100.0, 100.0, 0.0);
glEnd();

编辑#3

修改代码以反映Nicol Bolas的建议。

更新#1

修改后的代码现在有效。虽然我很好奇如何让glDrawArrays正常工作......我的实现看起来像:

glDrawArrays(GL_TRIANGLES, 0, 0);

这对我来说似乎不对,但spec说:

mode:指定要渲染的基元类型。接受符号常量GL_POINTS,GL_LINE_STRIP,GL_LINE_LOOP,GL_LINES,GL_TRIANGLE_STRIP,GL_TRIANGLE_FAN,GL_TRIANGLES,GL_QUAD_STRIP,GL_QUADS和GL_POLYGON。

first:指定已启用数组中的起始索引。

count:指定要呈现的索引数。

基于Nicol Bolas所说的,因为我不需要索引,所以0,0作为参数是有意义的。正确?

2 个答案:

答案 0 :(得分:3)

glGenBuffersARB(1, &vboId);

glBindBufferARB(GL_ARRAY_BUFFER_ARB, vboId);
glBufferDataARB(GL_ARRAY_BUFFER_ARB, dataSize, vertices, GL_STATIC_DRAW_ARB);

free(vertices);
glDeleteBuffersARB(1, &vboId);  // wat

glDeleteBuffersARB()调用后,指向的VBO ID无效,无法在glBindBufferARB()中使用。

此外:

glDrawElements(GL_TRIANGLES, 1, GL_UNSIGNED_BYTE, &indices);

您已将indices定义为unsigned int,因此您应使用GL_UNSIGNED_INT代替GL_UNSIGNED_BYTE

答案 1 :(得分:2)

 glDrawElements(GL_TRIANGLES, 1, GL_UNSIGNED_INT, &indices);

您可能知道,三角形由三个顶点组成。您正在发送一个(第二个参数)。你不能从一个位置画一个三角形。