问题标签 [buffer-objects]

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 回答
4993 浏览

opengl - 您可以使用单个 VBO 使用多个目标吗?

示例代码:

所以我们生成一个通用的 VBO 句柄,然后我们使用“GL_ARRAY_BUFFER”绑定它。绑定它似乎有两个目的:

  1. 我们必须先绑定缓冲区,然后才能通过以下方式将数据复制到 GPUglBufferData
  2. 我们必须先绑定缓冲区,然后才能通过glVertexAttribPointer

而且我认为这是您需要绑定 VBO 的唯一 2 次。我的问题是,是否存在目标(GL_ARRAY_BUFFER、GL_ELEMENT_ARRAY_BUFFER、GL_PIXEL_PACK_BUFFER 或 GL_PIXEL_UNPACK_BUFFER)在第 2 行和第 3 行不同的情况?或者我们想在第 4 行之前将它重新绑定到不同的目标?

我们可以将多个缓冲区目标绑定到单个 VBO 吗?

0 投票
1 回答
623 浏览

c++ - 如何在 OpenGL 中从一个 VBO 绑定多个 IBO

我正在尝试使用 IBO 渲染两个不同的三角形。我将六个顶点存储在一个 VBO 中,并尝试通过两个独立的 IBO 访问它们。问题是第一个 IBO 渲染但第二个没有。createVertices 和 createIndices 在初始化时被调用。

//////////

/////////

0 投票
2 回答
3622 浏览

opengl - Should VBO be unbound before calling glDeleteBuffers?

Is it required that we should unbind a buffer object before deleting it? If I had bound it in a VAO and deleted it without unbinding (binding to 0), what will happen? Will the reference still exist?

Is it a good or a bad practice to unbind before deletion?

0 投票
2 回答
2645 浏览

opengl - 使用像素缓冲区对象从 gpu 异步读取数据

如果您想与您的应用程序同步读取数据,从 gpu 获取数据似乎是一项非常缓慢的任务。一种可能性是在像素缓冲区对象的帮助下进行异步读取。不幸的是,我无法看到这是如何完成的。

首先我创建一个像素缓冲区对象:

然后我想从帧缓冲区对象中读取像素:

但这是如何异步的?glReadPixels 或 glMapBufferRange 是否会阻塞应用程序,直到 gpu “准备好”?

0 投票
1 回答
748 浏览

2d - OpenGL ES 3.0:零拷贝 CPU 渲染到纹理?

我正在做一个纯 2D 项目,屏幕由 CPU 渲染,我想将其显示为纹理,但我不想为每一帧上传整个图像。我不知道哪些部分发生了变化,所以我认为整个图像是无效的。

我需要做一些后期处理(添加另一个带有一些 blit 的层),我的早期测试表明这可能是纯粹使用 CPU 的性能问题,这就是我需要 GPU 加速的原因(2D 会好得多,但不常见/这些天便携......)。

我的目标平台是一个嵌入式系统 (ARM),其中 GPU 和 CPU 共享内存,所以理论上我可以在没有任何副本的情况下做到这一点。所选平台支持 OpenGL 2.1 和 OpenGL ES 3.0。

我知道缓冲区对象可以通过 glMapBufferRange​() 进行映射。我已经关注了以下可能性:

  • UNIFORM_BUFFER:太小,无法存储全屏图像

  • SHADER_STORAGE_BUFFER:仅从 ES 3.1 开始支持

  • 着色器图像加载存储:仅从 ES 3.1 开始支持

  • 缓冲区纹理:ES 3.0 不支持(从 ?? 支持)

  • 像素缓冲区对象:我无法从着色器中访问它们,在我看来,当我从中更新纹理时它确实会复制。我不知道它是否比从客户端内存复制更快(考虑到它们都驻留在同一个 RAM 芯片上:))

  • 普通纹理:不是缓冲区对象,不能映射到客户端进程内存

我错过了什么吗?ES 3.0 中没有办法与 GPU 共享一个缓冲区,其中包含我可以从 CPU 写入和从片段着色器读取的大量数据?

0 投票
1 回答
206 浏览

opengl - glBufferSubData 什么时候返回?

我想将一个非常大的内存块的内容传输到足够大的 GPU 缓冲区,然后立即更改 CPU 上的内存内容。类似这样的伪代码:

在这段代码中,glBufferSubData实际上做了什么?它是在返回之前将very_large_memory_chunk 转移到某个地方,还是只是安排转移操作以供以后执行?因此,如果我立即开始更改 CPU 缓冲区,是否可能会传输部分更改的内存,从而在 GPU 的very_large_buffer 中产生垃圾?

请注意,我不是在询问渲染调用。我知道如果缓冲区用于渲染,传输操作将等到渲染完成,反之亦然。我想知道 OpenGL 在 CPU 到 GPU 传输操作中的行为是否相同。

0 投票
1 回答
195 浏览

c# - 在多个着色器中使用的一个 UBO 中的偏移量

我使用这样的一个统一块:

在具有由 . 明确定义的相同绑定点的不同着色器中UniformBlockBinding

要使用统一缓冲区对象,需要以这种方式查询偏移量:

我为每个具有相同结果的着色器程序调用此代码。

如果我理解正确,偏移量代表统一缓冲区对象的结构,它是所有被调用程序的结构。

多次调用是否有意义,或者调用它就足够了?

0 投票
0 回答
189 浏览

canvas - 绘制到窗口时,通常会丢弃以前的内容吗?保存它们的最佳方法是什么?

我正在尝试加快 Inkscape 矢量图像编辑器中的渲染(延迟和吞吐量方面),以便它对艺术家更友好。

我正在尝试决定是直接绘制到窗口还是绘制到中间的屏幕外表面,然后将其复制到窗口。

如果每次都必须重新绘制整个画布,那么通过节省内存带宽,直接绘制到窗口显然会更快。但不幸的是,Inkscape 不进行 GPU 渲染,因此它无法重绘整个窗口,只能重绘无效的矩形。

假设我有 2 个矩形需要重绘。 在此处输入图像描述

第一种方法是使用 gdk_window_begin_draw_frame(rect) 获取每个矩形的子表面,绘制并将其发送到屏幕。但缺点是您不能并行绘制 2,因为 GTK 一次只允许锁定 1 个矩形。

我想到的第二种方法是向窗口系统(GTK)询问两个矩形的边界框。然后并行绘制 2,并将结果发送到屏幕。但这里的问题是 GTK 不保留窗口的旧内容 - 它清除了整个更新区域,在 2 个矩形之间的间隙中创建空白区域。

因此,要使第二种方法起作用,我可以要求 GUI 工具包保留窗口的内容,或者渲染到保留整个窗口的中间缓冲区。但这需要额外的复制。我想知道绘图时是否习惯丢弃以前的内容?我知道丢弃具有不必等待先前渲染完成并且不必从 GPU 内存读回 CPU 内存的性能优势。该建议是针对 OpenGL 的 glMapBuffer() 和 DirectX 表面的 LockRect() 给出的。但是 glMapBuffer() 确实可以选择返回旧内容。那么GTK也应该有这样的选择吗?还是问的太多了?

由于 GUI 工具包的限制,我面临的很多问题似乎都是人为的。例如,如果 GUI 工具包允许您并行更新多个区域,那么第一种方法会更有效且更容易。OpenGL 允许您使用 glMapBufferRange() 来完成此操作。

我想为 GTK 提供一个好的解决方案,但同时我想知道您是否可以非常直接地访问 GPU 硬件,您将如何最有效地实现我描述的部分绘图?

0 投票
0 回答
94 浏览

opengl - OpenGL,做天空盒并希望立方体外部被背面剔除,注意到一些奇怪的东西

我试图制作一个立方体来背面剔除侧面,我成功地完成了我的索引,所以它起作用了。但是我偶然发现了一件奇怪的事情,例如,当我想更改// bot索引时它没有在程序中更新,直到我调整了我GLuint indicies[36]的 toGLuint indicies[30]并注释掉了// bot并运行了程序并将其放回GLuint indicies[36].

程序运行之间是否存储在 GPU 中的 EBO 或指标?当我销毁我的班级时,我删除了 vao、vbo 和 ebo?

这是我的立方体顶点和索引:

感谢您提前回复!

0 投票
0 回答
90 浏览

opengl - 共享 VAO 的元素缓冲区对象大小

我想将我的索引几何存储在一个共享的 vao 中。

如果当前 vao 已满,我将创建另一个 vao 以及布局的缓冲区(Pos、Normals、Uvs 等)。我创建它们的能力是 N 个顶点。(可能是数千个,我想尽可能多地分享相似的几何图形)

问题是我不知道应该为应该支持索引 vao 的元素缓冲区对象分配多少大小。

这有一个常见的做法吗?

我需要为每个 VAO 提供一个 EBO,因为我想使用 glMultiDrawElements 调用绘制整个批次,因此批次必须具有相同 EBO 中的索引。