问题标签 [vertex-array-object]
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.
opengl-es - 是否可以在 Raspberry Pi 上使用顶点数组对象?
是否可以在 Raspberry Pi 上使用顶点数组对象?我可以将它作为扩展加载吗?
c++ - OpenGL - 正确更新顶点数组对象的顶点缓冲区绑定
我注意到我的程序中有一个奇怪的错误,当我在调用glVertexArrayVertexBuffer
. 在我的帧循环中,我通常为一个绘制调用使用一个 VAO,但有时我想将相同的 VAO 用于具有不同着色器的多个绘制调用。但这在我的实现中不起作用:
而这有效:
这也不起作用:
但这会起作用
...但这不是一个选项,因为我还想在我的帧循环中使用其他 VAO(并且我想保持灵活的顺序)。
那么这些函数在内部做什么呢?
这些draw
函数只需绑定一个 VAO 和一个着色器,进行一次绘制调用(通常glDrawElementsInstanced
),然后解除绑定着色器和 VAO。
该函数通常通过使用,和标志映射整个缓冲区的指针updateBuffers
写入缓冲区对象(用 初始化)。为了确保不会覆盖 GPU 仍在使用的任何数据,我总是写入缓冲区的不同分区。因此,在每次更新之前,我将写入偏移量增加上一次更新的大小(如果更新超过存储大小,则将其设置为 0)。glNamedBufferStorage
GL_MAP_WRITE_BIT
GL_MAP_PERSISTENT_BIT
GL_MAP_COHERENT_BIT
而且因为更新的数据应该对着色器可见,所以我也必须更新着色器绑定到的绑定点。我通过在每次更新时调用glBindBufferRange
统一缓冲区(由统一块使用)和glVertexArrayVertexBuffer
顶点缓冲区(用于顶点属性)来做到这一点,以使每个缓冲区的绑定偏移量从更新数据的位置开始。
这始终适用于统一缓冲区绑定(使用 更新偏移量glBindBufferRange
)但是当我更新 VAO 的顶点缓冲区的绑定(使用glVertexArrayVertexBuffer
)然后在glVertexArrayVertexBuffer
再次调用之前多次绑定和取消绑定该 VAO,我得到一个Invalid Operation
错误。
为什么会glVertexArrayVertexBuffer
导致 VAO 出现这样的行为?更新绑定到顶点缓冲区的 VAO 的偏移量的正确方法是什么?
java - 验证有关图表的信息
我在尝试使用 toString 方法打印 Graph 的内容时遇到了困难。此外,当我将我的顶点添加到我的图表时,我没有收到错误,但我不确定我是否正确添加了我的顶点。感谢任何人的帮助!
这是应用程序。
这是我的图表。
opengl - openGL绘图GL_LINES给出不正确的结果
我正在尝试绘制一个速度矢量网格,我希望每个网格点的速度是一条斜率为 1 的线。一条倾斜的线,但我总是以一条垂直线结束。我不确定我做错了什么。有什么我忽略的吗?
这是我的顶点缓冲区的外观:
这是我创建 VBO 和 VAO 的方式:
这是我的顶点着色器:
这是我的绘图代码:
这是我得到的图像: 结果图像
opengl - OpenGL VAO + 多个 VBO - 理论 - 批量渲染
我正在考虑调整我当前的批量渲染。我目前做的是用这样的命令运行一个循环:
本质上,我有 1 个 HUGE VBO,或者更像 3 个(顶点/法线/索引),我使用 1 个 VAO 将其全部绑定并渲染。当前渲染也适用于 1 材质 = 1 vao/3 VBOS(垂直/标准/索引)中的网格列表。
效果很好,但我现在想做的是创建一个向量,然后让每个 VBO 最多保持 500k 个索引。这个想法是将 1 个大缓冲区拆分为多个较小的缓冲区,这样如果用户更改材料,那么我不必重建整个大型 VBO,而只需重建较小的一个。假设有 1 亿个多边形,5 万个对象。重建可能需要一段时间......我想我测量过它,它是几秒钟。
所以问题是,给定我用来运行上面的循环以绘制对象的命令。我还能以某种方式使用它来绘制子 VBO 吗?上面的命令给出了 VBO 中每个项目的偏移/顶点起点,但是如果我在 1 个 VAO 下绑定多个 VBO,我看不到指定应该使用哪个 VBO 的方法。或者也许我应该每 1 个 VBO 列表(或包含所有 VBO 的结构)有 1 个 VAO,然后在循环中绑定每个 VBO,然后调用 draw?我只是有点担心使用 10k 绑定的 VBO 我会失去性能,并且在更换整个 VBO 时不会获得太多的加速?
希望这以某种方式......解释“问题”。
draw - glBindVertexArray 不会在 display() 中切换 VAO,但会在 init() 中切换
我正在尝试学习如何编程 OpenGL。现在我正在编写一个绘制立方体的程序。我将每个多维数据集存储在一个单独的 VBO 中。这是这个的代码。
当在 display() 中调用它时
该程序仅绘制 Cube2。但是,如果我插入
在 init() 结束时,它将仅绘制 Cube1。
现在我很困惑。我希望能够将 VAO 用于更复杂的应用程序,但我被困在这一点上。
c++ - 当抽象出一个类时,我的 OpenGL 顶点数组不再起作用
我正在使用 OpenGL 渲染一些立方体,我已经设法渲染了大约 10 个立方体,但是我现在想将代码抽象到类中。我从顶点数组对象开始。
我已经查看了代码并将其跟踪到着色器,以确保顶点数据到达它需要的位置。
此外,这是使用此类的 main() 部分:
我希望看到多个立方体呈现,但这不会发生。如果我将顶点数组直接实现到主文件中,则代码会呈现立方体,但是在抽象为类时它不会呈现任何内容。这里可能是什么问题?
c++ - 使用 glDrawElementsInstanced 进行实例渲染时的行为不一致,有时没有渲染且没有错误
我一直在使用 OpenGL 进行项目。使用实例化绘制调用渲染粒子。
问题是有时 glDrawElementsInstanced 不会渲染任何东西。并且没有错误报告。其他模型和效果渲染良好。但是我的粒子系统中没有粒子会渲染。绘图调用看起来像
ec
是一个用于e
rror c
heck opengl 的宏。它有效地做到了这一点:
渲染粒子的问题在发布模式下更为普遍,而不是调试模式;但在两种模式下都会发生。该问题发生8/10
在发布模式和1/10
调试模式下。
下面是粒子的渲染过程:对于每个实例化的drawcall...
- 绑定共享顶点缓冲区对象(vbo)
- 将数据放入该顶点缓冲区对象(vbo)
- 遍历许多顶点数组对象(vao),将 VBO 与它们关联并设置顶点属性
- 渲染每个 vao
所有对象共享相同的 VBO,但按顺序呈现。整个应用程序当前是单线程的,所以这应该不是问题。
粒子 A(两个 vao)和 B(一个 vao)的给定框架如下:
- -将 A 的数据缓冲到名为 VBO 的顶点缓冲区中
- -绑定 A_vao1
- -设置A的实例顶点属性
- -绑定 A_vao2
- -设置A的实例顶点属性
- -渲染 A_vao1
- -渲染 A_vao2
- -缓冲区 B 的数据到顶点缓冲区名称 VBO(没有 glGenBuffers,这是同一个缓冲区)
- -绑定 B_vao1
- -设置B的实例顶点属性
- -渲染 B_vao1
这种方法有明显的问题吗?
下面的源代码已被简化,但我留下了大部分相关部分。与我上面的不同,它实际上使用了 2 个共享顶点缓冲区对象 (VBO),一个用于 matrix4s,一个用于 vector4s。
这种可见性有什么问题吗?我已经调试过RenderDoc
,当问题不存在时,事件浏览器中会出现一个绘图调用,如下图所示:
但是当问题确实发生时,绘图调用根本不会出现RenderDoc
如下图所示:
这对我来说似乎很奇怪。我已经用调试器验证了绘图调用正在执行。但它似乎默默地失败了。
我尝试使用 nvidia nsight 进行调试,但通过 nvidia nsight 启动时无法重现它。
我已验证
- 实例 VBO 缓冲区大小不会改变或增长太大,它的大小是稳定的
- 制服是正确地找到价值
- vao 绑定似乎以正确的顺序发生
系统规格:Windows 10;Opengl3.3,8gb内存;i7-8700k,NVIDIA GeForce GTX TITAN X
在我的笔记本电脑上也观察到问题,再现率大致相同。它有一个英特尔图形芯片。
github 链接到实际源代码,如果有人尝试编译,请告诉我,您需要将隐藏的 .suo 替换为我制作的副本以自动填写链接器设置。功能:ParticleSystem::handlePostRender
opengl - 这个 GLSL mat4 顶点属性是否设置正确?
我将此顶点信息用作 GL_POINTS 几何着色器的输入。
设置颜色属性时,以下代码有效(使用m_location = glGetAttribLocation(...)
):
a 的幼稚版本mat4
不起作用,因为显然它必须作为 4 组 4 个浮点数发送。我写了这个
这是改编自其他人的代码,并且在阅读了 API 文档后,我仍然不确定我是否正确地执行了此操作。矩阵在着色器中表现异常。
有人可以澄清一下多个地点的情况glVertexAttribDivisor
吗?
上面的代码正确吗?
opengl - 关于使用 glVertexAttribPointer 绑定不存在属性的索引的困惑
使用 glVertexAttribPointer 绑定属性索引时,如果关联程序在所述索引处不包含属性,会发生什么情况?
行为是未定义的,还是完全忽略了该属性?
我已经对文档进行了相当广泛的搜索,但无法找到有关程序和动态属性绑定之间链接的大量信息。