问题标签 [vao]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
91 浏览

java - 渲染不同的 VAO

我正在使用 LWJGL/OpenGL 学习和编程。我想分块渲染我的地图。为此,我为每个块创建一个 VAO 和 VBO 并上传和链接它​​们。

问题是,如果我渲染第一个块,那么接下来的 3 个块都将在上面渲染。如果我渲染第二个块,下面的 2 个块将被渲染在顶部。

这是我的应用程序的日志,描述了我如何设置 VAO:

缓冲区大小符合预期。

对于绑定,我使用 glBindVertexArray() 和 glBindBuffer(GL_ARRAY_BUFFER, )

对于绘图,我使用 glDrawArrays()

我设置 VAO 的方式是错误的,还是您需要我的代码来解决我的问题?

0 投票
0 回答
273 浏览

c++ - OpenGL 纹理与数组缓冲区

我有一个基于网格的地形,带有整数 x 和 y 坐标。我目前发送一个每个顶点有 6 个浮点值的数组。3 表示位置,3 表示法线坐标。我想知道将法线和高度数据简单地存储在 2 个单独的纹理中并仅发送一个每个顶点具有 2 个 uv 坐标的数组是否更有效。问题可能是纹理必须具有非常高的分辨率,例如 4096x4096 或更大。

0 投票
1 回答
180 浏览

java - 清除 OpenGL Shader 中的属性位置

有没有办法覆盖或清除 OpenGL 中的属性位置?例如(我正在使用 lwjgl)我呈现如下内容:

之后我想用相同的 shaderProgramID 运行下一个代码

如您所见,我从此更改了以下代码:

对此:

但是当我运行这两个代码时,

返回 0 而不是 1

有没有办法清除以前绑定的位置,以便我可以绑定新的位置?

0 投票
1 回答
145 浏览

c++ - OpenGL 红皮书 - 如果枚举默认为从 0 开始的整数,glBindVertexArray 如何绑定到保留值 0?

我对 OpenGL Programming Guide 的第一个示例有点困惑。

作者使用了这个例子:

这是我的实现:

现在,问题是,我的实现编译并运行得很好,但我很困惑。在书中,它说glBindVertexArray()不会取 0,因为 0 是为默认状态保留的。但是,枚举永远不会初始化并默认为其索引。这意味着 OpenGL 绑定到一个 VAO 名称,当我调用glBindVertexArray(VAOs[TRIS]).

我的问题是:OpenGL真的绑定到 0 的名称,还是我遗漏了什么/理解错误?

先感谢您!

0 投票
0 回答
84 浏览

qt - Qt/OpenGL 问题。除非首先显示 QGLWidget,否则基元不会呈现

所以我有一个带有多个选项卡的 Qt 应用程序。在其中一个选项卡中,我有一个 QGLWidget,我在其中尝试使用 VAO/VBO 呈现原语。

我的初始化代码如下所示:

我在paintGL() 循环中的绘制代码是这样的:

只要首先显示我的带有 QGLWidget 的选项卡,它就可以正常工作。但是,如果 QGlWidget 没有首先显示,这将不起作用。VAO/VBO 初始化正确发生(我已经用 glGetError() 检查了这个,事情看起来还不错),但是,因为绘制/绘制循环不会在之后立即被调用(我必须切换到 GL 选项卡以触发paintGL draw),当我切换到 GL 选项卡时,根本没有任何渲染。同样,如果我将 QGLWidget 设为第一个选项卡,则在我初始化后几乎立即触发绘制并且一切都呈现正常。

为什么会这样?我在这里错过了什么吗?如果绘图循环/paintGL 不会立即发生,那么初始化 VAO/VBO 是否有任何原因?

我想我还应该提到我不使用着色器。这是一个遗留应用程序,所以我慢慢开始更新它。第一步是获取卡片的顶点。最初我们使用调用 glEnableClientState 而不是 VAO/VBO,但我的转换都是通过矩阵堆栈处理的,颜色是通过 glColor 指定的。

0 投票
1 回答
2103 浏览

c++ - Opengl vao 与 ebo

我目前正在空闲时间学习 OpenGL,最近我遇到了一个我不明白的“错误”。

问题是,我没有错误,我的屏幕上只出现什么。我正在使用带有 SFML 的 OpenGL。

这是我的代码。这是我的方法:

我知道我的问题不在于我的着色器,因为我在控制台中使用 GlshaderRiv() 没有收到任何错误。

我想知道我的订单是否正确。

  1. 我创建了一个 VBO 和一个 EBO
  2. 我创建了一个 VAO
  3. 我绑定当前的VAO来修改它
  4. 我将当前 VBO 绑定到 VAO 中
  5. 我在我的 VBO 中绑定了我的第一个数组(顶点位置向量 3f),并将它们放在具有正确偏移和步幅的第一个指针中。
  6. 我在我的 VBO 中绑定了我的第二个数组(颜色位置向量 3f),并将它们放在第一个指针中,并具有正确的偏移量和步幅。
  7. 我在我的 VBO 中绑定了我的第三个数组(纹理位置向量 2f),并将它们放在具有正确偏移和步幅的第一个指针中。
  8. 我在 VAO 中绑定了一个 EBO
  9. 我将 EBO 与我的元素位置(矢量 3u)绑定。
  10. 我从内存中取消绑定 VAO,因为我的绘图循环在代码中很晚,所以我不想白白使用内存空间。别担心,在我画之前我把 glBindVertexArray(&vao);
0 投票
0 回答
1359 浏览

c++ - 尝试实现 VAO 时出现 glMapBufferRange 错误“缓冲区必须绑定且未映射”

所以麻烦的是我要写入缓冲区:

这对于第一次通话确实有效,但在第二次通话中效果不佳,我不确定为什么会这样。

在可能的原因中:

  • 如果零绑定到目标,则 GL_INVALID_OPERATION 由 glMapBufferRange 生成。
  • 如果 offset 或 length 为负,如果 offset+length 大于缓冲区对象的 GL_BUFFER_SIZE 的值,或者如果 access 设置了除上述定义之外的任何位,则生成 GL_INVALID_VALUE。
  • 长度为零。
  • 缓冲区对象已经处于映射状态。
  • GL_MAP_READ_BIT 和 GL_MAP_WRITE_BIT 都没有设置。
  • 设置了 GL_MAP_READ_BIT 并且设置了 GL_MAP_INVALIDATE_RANGE_BIT、GL_MAP_INVALIDATE_BUFFER_BIT 或 GL_MAP_UNSYNCHRONIZED_BIT 中的任何一个。
  • GL_MAP_FLUSH_EXPLICIT_BIT 已设置且 GL_MAP_WRITE_BIT 未设置。
  • 设置了 GL_MAP_READ_BIT、GL_MAP_WRITE_BIT、GL_MAP_PERSISTENT_BIT 或 GL_MAP_COHERENT_BIT 中的任何一个,但缓冲区的存储标志中不包含相同的位。

...我不确定如何验证/修复的唯一一个是“缓冲区对象已经处于映射状态”。这可能与我看到的错误有关吗?

如果是这样,我阅读了有关 GL_MAP_PERSISTENT_BIT 的信息,但我们的目标是 4.2,而 glBufferStorage 需要 4.4,所以我不确定在这种情况下我还能如何补救这种情况。

不幸的是,我不能在不修改大量内容的情况下发布所有涉及的代码,但我的基本设置是为每个新创建的 GL_ARRAY_BUFFER 创建一个 VAO,并且每当绑定缓冲区(没有 VAO 的代码)时,我而是绑定 VAO。

绑定的 VAO 用于我们称之为“滚动 VBO”的缓冲区,因为它被用作我们所有文本和其他杂项的一种捕获所有内容。渲染。也许是因为它被用于很多不同的东西......但我不确定如何确定它到底是什么。

如果有任何代码片段或其他信息有帮助,请告诉我,我不确定这个问题究竟需要什么。非常感谢您的帮助!

0 投票
1 回答
105 浏览

c++ - OpenGL 在渲染帧之前崩溃 - VBO

在放弃了缓慢的 glBegin/glEnd 技术之后,我最终决定使用 VBO。经过几个小时的挫折,我终于把它编译了。但这并不意味着它有效。函数“CreateVBO”执行没有错误,但是一旦glutMainLoop()被调用,程序就会崩溃,它甚至不会调用Reshape()orRender()函数。

这是CreateVBO()函数:(注意:“lines”变量等于 400 万,整个程序只是在我可以做一些真正有意义的事情之前渲染多行的压力测试)

这是Render()功能。我不知道它可能出了什么问题,因为程序甚至在调用该函数之前就崩溃了。

0 投票
1 回答
675 浏览

c++ - OpenGL- glDrawElements 只绘制第一个元素

大家好,我正在为我的游戏制作一个小 3d 引擎,并且我为顶点数组和 VBO 创建了一个类。在我尝试向顶点数组添加索引之前,它一直在工作。现在它只绘制索引的第一个元素!

这是生成 VAO 和 VBO 的函数构建。

}

这是绘制VAO的函数draw。

}

注意:我删除了 glEnableClientState(GL_VERTEX_ARRAY) 因为它没有做任何事情。

0 投票
0 回答
61 浏览

c++ - VAO索引只画一条线?

大家好,我正在尝试绘制索引 VAO,但它并没有真正起作用。它只绘制第一个元素(第一行)。我画了两条只有三个顶点的线,但只有第一个作品。VAO创建代码:

绘图代码: