Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 如何使用VBO绘制三角形?_C_Windows_Opengl_Vbo - Fatal编程技术网

C 如何使用VBO绘制三角形?

C 如何使用VBO绘制三角形?,c,windows,opengl,vbo,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

我试图让我的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

以下代码起作用(只是为了证明投影设置正确):

编辑#3

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

更新#1

修改后的代码现在可以工作了。尽管我很好奇如何让GLDrawArray正常工作……但我的实现看起来像:

glDrawArrays(GL_TRIANGLES, 0, 0);
这在我看来似乎不对,但报告说:

模式:指定要渲染的基本体的类型。接受符号常量GL_点、GL_线带、GL_线环、GL_线、GL_三角形带、GL_三角形扇形、GL_三角形、GL_四边形带、GL_四边形和GL_多边形

第一:指定启用数组中的起始索引

计数:指定要渲染的索引数

根据Nicol Bolas所说的,因为我不需要索引,所以0,0作为参数是有意义的。对吧?

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无效,无法在
glbindbuffersarb()
中使用

此外:

您已经将
索引
定义为
无符号整数
,因此应该使用
GL\u无符号整数
而不是
GL\u无符号字节

 glDrawElements(GL_TRIANGLES, 1, GL_UNSIGNED_INT, &indices);
调用
glDeleteBuffersARB()
后,指向的VBO ID无效,无法在
glbindbuffersarb()
中使用

此外:

您已经将
索引
定义为
无符号整数
,因此应该使用
GL\u无符号整数
而不是
GL\u无符号字节

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


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

我已更新代码以反映您的建议,尽管,我仍有相同的问题。我已更新代码以反映您的建议,尽管,我仍有相同的问题。我已更新代码以反映您的建议,尽管,我仍然有同样的问题。你必须实际使用三个索引。数组中只有一个元素。另外,为什么要使用
glpaurements
?为什么不使用
glDrawArrays
,这是在没有索引时使用的。就像你的代码一样。Tbh…这是因为我试图遵循以下原则:我现在将尝试使用glDrawArrays。我已经更新了我的代码以反映你的建议,不过,我仍然有同样的问题。你必须实际使用三个索引。数组中只有一个元素。另外,为什么要使用
glpaurements
?为什么不使用
glDrawArrays
,这是在没有索引时使用的。就像你的代码一样。Tbh…这是因为我一直试图遵循这个:我现在将尝试使用GLDrawArray。
 glDrawElements(GL_TRIANGLES, 1, GL_UNSIGNED_INT, &indices);