OpenGL绘制顶点缓冲区对象

奥术强化者

我有两个'std :: vector's,一个用于索引,一个用于顶点,用std :: vector.push_back()填充。那我做

glGenBuffers(1, &verticesbuffer);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, verticesbuffer);
glBufferData(GL_ELEMENT_ARRAY_BUFFER, /*EDITED-->*/vertices.size() * sizeof(vertices[0])/*<--EDITED*/, &vertices[0], GL_STATIC_DRAW);

为每个缓冲区创建缓冲区,然后尝试使用

glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);

glBindBuffer(GL_ARRAY_BUFFER, verticesbuffer);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, indicesbuffer);

glDrawElements(
    GL_TRIANGLES,
    indices.size(),
    GL_UNSIGNED_INT,
    &indices[0]
    );

glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);

当我运行程序时,什么都没有显示。我可以使用glBegin()/ glEnd()方法使其正常工作,但是索引的vbo不能正常工作(glGetError()也不会给出任何错误)。我什至不知道这是否几乎可以纠正,因为我已经搜索了无数教程和其他stackoverflow问题,并尝试了许多其他方法来解决它。我还应该提到我打电话给

glLoadIdentity();
glMatrixMode(GL_MODELVIEW);
glOrtho(0.0f, windowX, windowY, 0.0f, 0.0f, 1000.0f);

在程序开始时,我也不知道这是否正确(如您所见,在这方面我还很陌生)。

您误解了sizeof操作员的工作方式。它是一个运算符,在编译时执行,并返回指定类型或变量的大小(以字节为单位)。

float f;
std::cout << sizeof(f); // prints 4
std::cout << sizeof(float); // prints 4

但是,当我们使用sizeof指向数组的指针时会发生什么呢?让我们研究以下情况:

float array1[50]; // static size array, allocated on the stack
float *array2 = new float[50]; // dynamic size array, allocated on the heap

std::cout << sizeof(array1); // prints 200, which is ok (50*4 == 200)
std::cout << sizeof(array2); // prints out the size of a float pointer, not the array

在第一种情况下,我们sizeof在堆栈上分配的静态数组上使用。由于array1的大小是恒定的,因此编译器会知道它,并以on的字节为单位返回它的实际大小sizeof(array1)

在第二种情况下,我们sizeof在分配给堆的动态数组上使用。array2理想情况下,其大小在编译时无法得知(否则,如果适合堆栈,则应使用静态数组),因此编译器对数组array2的大小一无所知,因此它返回指向我们数组的指针大小

sizeof在std :: vector上使用时会发生什么

std::vector<float> vec(50);
std::cout << sizeof(vec); // prints out the size of the vector (but it's not 4*50)

但是如果sizeof(vec)返回向量的大小,为什么不返回4 * 50?std :: vector管理一个基础动态分配的数组(在前面的示例中为第二种情况),因此编译器对该基础数组的大小一无所知。这就是为什么它返回矢量对象的整体封装(隐藏)变量的大小,包括指向实际数组数据的指针的大小的原因。如果需要基础数组中的元素数量,则需要使用vec.size()。要获取基础浮点数组的大小(以字节为单位),请使用 vec.size() * sizeof(float)

利用以上知识来修正您的代码:

std::vector<float> vertices;
// ...add vertices with push_back()...
glBufferData(GL_ELEMENT_ARRAY_BUFFER, vertices.size() * sizeof(float), &vertices[0], GL_STATIC_DRAW);

或者

std::vector<float> vertices;
// ..add vertices with push_back()...
glBufferData(GL_ELEMENT_ARRAY_BUFFER, vertices.size() * sizeof(vertices[0]), &vertices[0], GL_STATIC_DRAW);

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

OpenGL复制顶点缓冲区对象

来自分类Dev

冗余顶点缓冲区导致OpenGL无法正确绘制

来自分类Dev

冗余顶点缓冲区导致OpenGL无法正确绘制

来自分类Dev

使用顶点缓冲区对象的最低OpenGL ES版本

来自分类Dev

动态打包OpenGL顶点缓冲区对象的数据

来自分类Dev

何时清除顶点缓冲区对象

来自分类Dev

何时清除顶点缓冲区对象

来自分类Dev

通过pyopengl OpenGL.arrays.vbo更改OpenGL顶点缓冲区对象数据无效

来自分类Dev

更改顶点缓冲区对象中的顶点颜色

来自分类Dev

绘制渲染缓冲区对象的内容

来自分类Dev

OpenGL顶点数组对象是存储顶点缓冲区名称和索引,还是仅存储索引?

来自分类Dev

OpenGL顶点数组对象是存储顶点缓冲区名称和索引,还是仅存储索引?

来自分类Dev

OpenGL更新顶点数组/缓冲区

来自分类Dev

OpenGL:是否可以环绕顶点缓冲区?

来自分类Dev

OpenGL 4向顶点缓冲区提供数据

来自分类Dev

OpenGL无法使用VAO过程更新顶点缓冲区

来自分类Dev

OpenGL顶点缓冲区不正确渲染

来自分类Dev

如何更改opengl中放入顶点缓冲区的值?

来自分类Dev

在OpenGL中使用不同的缓冲区绘制多个对象

来自分类Dev

合并顶点缓冲区

来自分类Dev

JOGL中具有顶点缓冲区对象的问题

来自分类Dev

编写Wavefront OBJ分析器以与OpenGL索引的顶点缓冲区对象一起使用

来自分类Dev

在屏幕上绘制OpenGL渲染缓冲区

来自分类Dev

OpenGL:帧缓冲区-绘制纹理-glClearColor

来自分类Dev

当缓冲区数据来自堆时,opengl不会绘制

来自分类Dev

OpenGL-从顶点着色器访问缓冲区中的下3个顶点

来自分类Dev

glBindBuffer:缓冲区名称不引用OpenGL生成的缓冲区对象

来自分类Dev

Android位图对象作为绘制缓冲区

来自分类Dev

OpenGL纹理缓冲区对象的目的是什么?

Related 相关文章

  1. 1

    OpenGL复制顶点缓冲区对象

  2. 2

    冗余顶点缓冲区导致OpenGL无法正确绘制

  3. 3

    冗余顶点缓冲区导致OpenGL无法正确绘制

  4. 4

    使用顶点缓冲区对象的最低OpenGL ES版本

  5. 5

    动态打包OpenGL顶点缓冲区对象的数据

  6. 6

    何时清除顶点缓冲区对象

  7. 7

    何时清除顶点缓冲区对象

  8. 8

    通过pyopengl OpenGL.arrays.vbo更改OpenGL顶点缓冲区对象数据无效

  9. 9

    更改顶点缓冲区对象中的顶点颜色

  10. 10

    绘制渲染缓冲区对象的内容

  11. 11

    OpenGL顶点数组对象是存储顶点缓冲区名称和索引,还是仅存储索引?

  12. 12

    OpenGL顶点数组对象是存储顶点缓冲区名称和索引,还是仅存储索引?

  13. 13

    OpenGL更新顶点数组/缓冲区

  14. 14

    OpenGL:是否可以环绕顶点缓冲区?

  15. 15

    OpenGL 4向顶点缓冲区提供数据

  16. 16

    OpenGL无法使用VAO过程更新顶点缓冲区

  17. 17

    OpenGL顶点缓冲区不正确渲染

  18. 18

    如何更改opengl中放入顶点缓冲区的值?

  19. 19

    在OpenGL中使用不同的缓冲区绘制多个对象

  20. 20

    合并顶点缓冲区

  21. 21

    JOGL中具有顶点缓冲区对象的问题

  22. 22

    编写Wavefront OBJ分析器以与OpenGL索引的顶点缓冲区对象一起使用

  23. 23

    在屏幕上绘制OpenGL渲染缓冲区

  24. 24

    OpenGL:帧缓冲区-绘制纹理-glClearColor

  25. 25

    当缓冲区数据来自堆时,opengl不会绘制

  26. 26

    OpenGL-从顶点着色器访问缓冲区中的下3个顶点

  27. 27

    glBindBuffer:缓冲区名称不引用OpenGL生成的缓冲区对象

  28. 28

    Android位图对象作为绘制缓冲区

  29. 29

    OpenGL纹理缓冲区对象的目的是什么?

热门标签

归档