- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
出于某种原因,该程序仅在我创建 VAO 后再次绑定(bind) IBO/EBO 时才有效。我在网上读到,和多篇 SO 帖子,glBindBuffer 仅绑定(bind)当前缓冲区,并且它不将其附加到 VAO。我认为 glVertexAttribPointer 是将数据附加到 VAO 的函数。
float points[] = {
-0.5f, 0.5f, 0.0f, // top left = 0
0.5f, 0.5f, 0.0f, // top right = 1
0.5f, -0.5f, 0.0f, // bottom right = 2
-0.5f, -0.5f, 0.0f, // bottom left = 3
};
GLuint elements[] = {
0, 1, 2,
2, 3, 0,
};
// generate vbo (point buffer)
GLuint pb = 0;
glGenBuffers(1, &pb);
glBindBuffer(GL_ARRAY_BUFFER, pb);
glBufferData(GL_ARRAY_BUFFER, sizeof(points), points, GL_STATIC_DRAW);
// generate element buffer object (ibo/ebo)
GLuint ebo = 0;
glGenBuffers(1, &ebo);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, ebo);
glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(elements), elements, GL_STATIC_DRAW);
// generate vao
GLuint vao = 0;
glGenVertexArrays(1, &vao);
glBindVertexArray(vao);
glBindBuffer(GL_ARRAY_BUFFER, pb);
glVertexAttribPointer(0, 3, GL_FLOAT, GL_FALSE, 0, NULL);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, ebo); // when I bind buffer again, it works
glEnableVertexAttribArray(0);
glEnableVertexAttribArray(1);
如果我没有第二个 glBindBuffer,程序就会崩溃。我想知道的是为什么在创建VAO之后我必须再次调用glBindBuffer,当调用glBindBuffer时只会使缓冲区成为其他函数的事件缓冲区。
最佳答案
问题出在您的初始调用的顺序上。 GL_ELEMENT_ARRAY_BUFFER
绑定(bind)是 VAO 状态的一部分。看看这个序列:
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, ebo);
glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(elements), elements, GL_STATIC_DRAW);
GLuint vao = 0;
glGenVertexArrays(1, &vao);
glBindVertexArray(vao);
由于 GL_ELEMENT_ARRAY_BUFFER
绑定(bind)是 VAO 状态的一部分,因此序列末尾的 glBindVertexArray()
调用将建立 GL_ELEMENT_ARRAY_BUFFER
缓冲区绑定(bind)是您要绑定(bind)的 VAO vao
的一部分。由于您刚刚创建了 vao
,因此它是 0
。因此,在此序列的末尾,您没有元素数组缓冲区绑定(bind)。
或者,从不同的方向来看,当您在开始时调用 glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, ebo)
时,VAO 0
被绑定(bind)。因此,此绑定(bind)成为 VAO 0
状态的一部分。然后,当您绑定(bind)不同的 VAO vao
时,您将丢失该绑定(bind),并替换为属于 VAO vao
状态一部分的绑定(bind)。
要使其按预期工作,您需要在绑定(bind) VAO 之后进行初始 GL_ELEMENT_ARRAY_BUFFER
绑定(bind)。然后它就成为VAO状态的一部分,并且以后每次绑定(bind)VAO时都会再次建立:
GLuint vao = 0;
glGenVertexArrays(1, &vao);
glBindVertexArray(vao);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, ebo);
glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(elements), elements, GL_STATIC_DRAW);
关于c++ - 使用 IBO/EBO 时,程序仅在创建 VAO 后调用 glBindBuffer 绑定(bind) IBO/EBO 时才有效,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31176226/
我只是想了解 VBO 和 IBO 如何在 WEBGL 中工作。这是我的理解:IBO 有助于减少传递给 GPU 的信息量。所以我们有一个 VBO,然后我们创建一个 IBO,其索引指向 VBO。我怀疑 W
我只是想了解 VBO 和 IBO 如何在 WEBGL 中工作。这是我的理解:IBO 有助于减少传递给 GPU 的信息量。所以我们有一个 VBO,然后我们创建一个 IBO,其索引指向 VBO。我怀疑 W
出于某种原因,该程序仅在我创建 VAO 后再次绑定(bind) IBO/EBO 时才有效。我在网上读到,和多篇 SO 帖子,glBindBuffer 仅绑定(bind)当前缓冲区,并且它不将其附加到
我正在分析一个经过混淆处理的 OpenGL 应用程序。我想生成一个 .obj 文件来描述应用程序中显示的多边形模型。 所以我卡住了应用程序并挖掘出 VBO 和 IBO 中设置的值。但是 IBO 中设置
我在让 OpenGL 工作时遇到问题,基本上我得到交替的黑色和灰色屏幕。我使用固定功能管道(glBegin()、glEnd() 和 glTexCoord...)可以正常工作 我认为我做错了一些事情,这
我正在使用存储在名为 CMesh 的类的对象中的 OpenGL 渲染几个网格。 CMesh 包含许多由 CVertex 对象和三角形表示的顶点。每个 CVertex 都包含一个 Vector 及其位置
我只是在看我的动画 Sprite 代码,并得到一些想法。 动画是通过改变 tex 坐标制作的。它有缓冲区对象,它保存当前帧纹理坐标,当新帧被请求时,新的纹理坐标通过 glBufferData() 馈入
所以,最近我们(我和我的同事)一直在讨论迁移到 FireDac,我们目前正在使用 IBO 和 DBX,但主要是 IBO。然后我们决定采用从 IBO 到 FireDac 的所有内容,但是输入每个表单、更
GLuint vao; glGenVertexArrays(1, &vao); glBindVertexArray(vao); glEnableVertexAttribArray(0); vbo.bi
出于学习目的,我决定使用 3 种方法绘制球体 显示列表 Voa Vbo (GL_TRIANGLE_STRIPE) Vao Vbo 和 Ibo (GL_TRIANGLES) 我听说使用 ibo 可以使程
我使用 OpenGL 和 GLSL 开发了一个小型 3D 引擎。 我已经合并了一个顶点数据批处理系统,其目标是收集所有几何图形(所有对象)共享相同的着色器程序和相同的变换在一个唯一的顶点缓冲区对象(V
我一直在关注列出的教程 here . 我想使用一个索引缓冲区对象、一个顶点缓冲区对象、我自己的顶点和片段着色器以及我自己的顶点结构来绘制一个三角形。 我的问题是当我绘制时没有任何显示。我不确定我做错了
我正在开发一个小项目,我正在使用 VBO、IBO 和 VAO,我有一个顶点数组及其各自的数组索引,我对 Material 做同样的事情(因为相同的顶点可以有不同的另一边的 Material ),但是
当我只有一个 VBO 和一个 VAO 时,一切正常,但在添加 IBO 时,我得到一个黑屏。这是代码: 初始化: GLuint vbo = 0; glGenBuffers(1, &vbo); glBin
我正在尝试将 VAO + VBO + IBO 与着色器一起使用,但没有绘制任何对象。我不确定我错过了什么。我对 C++ 和 GLSL 还是很陌生,所以我不确定我是否在一般情况下搞砸了 C++,或者我是
与使用简单的顶点数据相比,使用 VBO(顶点缓冲区对象)和 IBO(索引缓冲区对象)的好处是什么? 什么时候是使用它们的好时机?将3D 模型 加载到它们中会不会更复杂?如果是这样,有什么好处? VBO
我正在使用在 CUDA 上运行的 Marching Cubes 算法从体积数据生成网格。 我尝试过保存网格并以 3 种方式渲染它。 将一组粗略的三角形保存为连续的顶点数据数组。如果第一次通过,我估计大
我无法让关卡数据显示在屏幕上。我的着色器正在使用正确渲染立方体但不是关卡。 这是我的 VBO、VAO 和 IBO 的设置: void ZoneMesh::buildData() { // Cr
在做了一些基本的测试之后,我还不清楚一些事情: 当您初始化应用程序时,绑定(bind) vao、vbo 和 ibo 的顺序是否重要?在大多数教程中,我看到您首先生成 vao,然后生成 vbo,然后生成
我的代码正常工作,但这可能是巧合,我不想稍后再讨论错误,所以我尽量保持它的整洁: 我执行以下操作来初始化网格: 生成并绑定(bind) VBO 和缓冲数据 生成并绑定(bind) IBO 和缓冲数据
我是一名优秀的程序员,十分优秀!