- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在开发一个小项目,我正在使用 VBO、IBO 和 VAO,我有一个顶点数组及其各自的数组索引,我对 Material 做同样的事情(因为相同的顶点可以有不同的另一边的 Material ),但是 VAO 中的这个链接同样不显示任何内容。每个 VAO 都必须是 IBO?
附件是我的代码,分别向gpu和render发送数据!
非常感谢您的帮助,问候 :)
void Upload(){
GLuint ibo[2], vbo[3];
glGenBuffers(3, vbo);
glGenBuffers(2, ibo);
glGenVertexArrays(1, vao);
glBindBuffer(GL_ARRAY_BUFFER, vbo[0]); //Vertices
glBufferData(GL_ARRAY_BUFFER, vertices.size()*sizeof(vec3), vertices.data(), GL_STATIC_DRAW);
glBindBuffer(GL_ARRAY_BUFFER, vbo[1]); //Normales
glBufferData(GL_ARRAY_BUFFER, vertex_normal.size()*sizeof(vec3), vertex_normal.data(), GL_STATIC_DRAW);
glBindBuffer(GL_ARRAY_BUFFER, 0);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, ibo[0]);
glBufferData(GL_ELEMENT_ARRAY_BUFFER, v_indices.size()*sizeof(GLuint), v_indices.data(), GL_STATIC_DRAW);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);
glBindBuffer(GL_ARRAY_BUFFER, vbo[2]); //Material
glBufferData(GL_ARRAY_BUFFER, materials.size()*sizeof(Material), materials.data(), GL_STATIC_DRAW);
glBindBuffer(GL_ARRAY_BUFFER, 0);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, ibo[1]);
glBufferData(GL_ELEMENT_ARRAY_BUFFER, m_indices.size()*sizeof(GLuint), m_indices.data(), GL_STATIC_DRAW);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);
glBindVertexArray(vao[0]);
//Vertices:
glEnableVertexAttribArray(attrib_vertex);
glBindBuffer(GL_ARRAY_BUFFER, vbo[0]);
glVertexAttribPointer(attrib_vertex, 3, GL_FLOAT, GL_FALSE, 0, 0);
//Normales:
glEnableVertexAttribArray(attrib_normal);
glBindBuffer(GL_ARRAY_BUFFER, vbo[1]);
glVertexAttribPointer(attrib_normal, 3, GL_FLOAT, GL_FALSE, 0, 0);
//IBO:
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, ibo[0]);
//Materiales:
for(int i=0; i<5; ++i)
glEnableVertexAttribArray(attrib_material+i);
glBindBuffer(GL_ARRAY_BUFFER, vbo[2]);
glVertexAttribPointer(attrib_material, 4, GL_FLOAT, GL_FALSE, sizeof(Material), NULL);
glVertexAttribPointer(attrib_material+1, 4, GL_FLOAT, GL_FALSE, sizeof(Material), (void*)offsetof(Material, diffuse));
glVertexAttribPointer(attrib_material+2, 4, GL_FLOAT, GL_FALSE, sizeof(Material), (void*)offsetof(Material, specular));
glVertexAttribPointer(attrib_material+3, 4, GL_FLOAT, GL_FALSE, sizeof(Material), (void*)offsetof(Material, emission));
glVertexAttribPointer(attrib_material+4, 1, GL_FLOAT, GL_FALSE, sizeof(Material), (void*)offsetof(Material, shininess));
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, ibo[1]);
//Desactivando todo:
glBindVertexArray(0);
glBindBuffer(GL_ARRAY_BUFFER, 0);
glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0);
glDisableVertexAttribArray(attrib_vertex);
glDisableVertexAttribArray(attrib_normal);
for(int i=0; i<5; ++i)
glDisableVertexAttribArray(attrib_material+i);
}
void Draw(){
glBindVertexArray(vao[0]);
glDrawElements(GL_TRIANGLES, v_indices.size(), GL_UNSIGNED_INT, 0);
glBindVertexArray(0);
}
最佳答案
每个 VAO 存储当前 GL_ELEMENT_ARRAY_BUFFER_BINDING
的值。
当您调用 glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, ibo[0])
和 glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, ibo[1])
时设置该存储值。
您的代码的问题是您对 glBindBuffer(GL_ELEMENT_ARRAY_BUFFER,...)
的第二次调用覆盖了第一次调用存储的值。发生这种情况是因为每个 VAO 只能为 GL_ELEMENT_ARRAY_BUFFER_BINDING
存储一个值。也就是说,每个 VAO 只允许 1 个 IBO。
我提出的一些解决方案:
glVertexAttribDivisor
。无论哪种方式,核心问题是每个 VAO 只能有 1 个 IBO。您必须发挥创造力才能找到适合您使用的解决方案。祝你好运!
关于VAO 中的 C++ GLSL 多个 IBO,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25135574/
我只是想了解 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 和缓冲数据
我是一名优秀的程序员,十分优秀!