- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我目前正在使用 UBO 在 OpenGL 4.3 中进行渲染,以将我所有的常量数据存储在 GPU 上。 (诸如 Material 描述、矩阵等之类的东西)。它可以工作,但是 UBO 的小尺寸(我的实现为 64kB)迫使我多次切换缓冲区以减慢渲染速度,我正在寻找类似的方法来存储几 MB。
经过一些研究后,我发现 SSBO 确实允许这样做,但也有不需要的“功能”:它们可以从着色器中写入,并且读取速度可能较慢。
是否有比 SSBO 更好的解决方案来为着色器提供大块数据?我觉得我错过了一些东西,为什么要将 UBO 限制在几 kB 而存在能够处理更多数据的更灵活的解决方案?如果着色器存储缓冲区是我正在寻找的,有没有办法确保它们不被着色器修改?
最佳答案
UBO 和 SSBO 从根本上代表两种不同的硬件(通常)1。
着色器按组执行,因此每个着色器都以锁步方式执行。每组单独的着色器调用都可以访问一 block 内存。这种内存就是 UBO 所代表的。它相对较小(以千字节为单位),但访问速度非常快。执行渲染操作时,来自 UBO 的数据被复制到此着色器本地内存中。
SSBO 代表全局内存。它们基本上是指针。这就是它们通常没有存储限制的原因(最小 GL 要求是 16 兆字节,大多数实现返回一个与 GPU 内存大小相近的数字)。
它们的访问速度较慢,但这种性能是因为它们存在的位置和访问方式,而不是因为它们可能不是常量。全局内存是全局 GPU 内存而不是本地常量内存。
如果着色器需要访问的数据多于其着色器本地内存所能轻松容纳的数据,则它需要使用全局内存。没有办法解决这个问题,即使您有办法将 SSBO 声明为“常量”。
1:存在没有专用 UBO 存储的硬件(基于 GCN 的 AMD 硬件)。该硬件将 UBO 实现为只读 SSBO,因此所有 UBO 访问都是全局内存访问。这种硬件基本上依赖于拥有大缓存来弥补性能差异,而 UBO 的使用模式往往使这种做法可行。但是仍然有很多硬件具有用于 UBO 存储的专用空间,因此如果您的使用符合这些限制,则应该使用它们。
关于c - SSBO 作为更大的 UBO?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33589784/
我想要一个在输出缓冲区中写入 1 的计算着色器。我编译着色器并将其附加到程序,没有问题,然后调用glDispatchCompute()函数并等待计算着色器结束。但当我看到数组时,只有 0。 谁能告诉我
“着色器存储缓冲区对象”(SSBO)和图像加载存储操作之间有什么区别 什么时候应该使用一个而不是另一个? 它们都可以进行原子操作,我假设它们存储在相同类型的内存中。而且无论它们是否存储在相同类型的内存
我看到这篇文章指出原子计数器缓冲区和 SSBO 中的原子变量之间的性能没有差异: https://software.intel.com/en-us/articles/opengl-performanc
这是OpenGL and loading/reading data in AoSoA (hybrid SoA) format之后的一个问题. 我正在尝试使用着色器存储缓冲区对象 (SSBO) 来存储在
我正在尝试进行一些数据压缩实验。我正在尝试将 3D 纹理压缩到哈希表中以避免存储空的体积信息。 为此,我编写了散列函数和检索函数(它们在不同的着色器中): struct Voxel { int
我从 Khronos wiki 中获取了以下 SSBO 声明: struct ssbo_data_t { int foo; float bar[42]; float baz[M
我目前正在使用 UBO 在 OpenGL 4.3 中进行渲染,以将我所有的常量数据存储在 GPU 上。 (诸如 Material 描述、矩阵等之类的东西)。它可以工作,但是 UBO 的小尺寸(我的实现
我不确定哪种结构布局最适合我的应用程序:共享、打包、std140、std430。我并不是要求对每个信息进行解释,这些信息很容易找到,只是很难弄清楚每个信息对供应商兼容性/性能的影响。如果 shared
我一直在尝试初始化 SSBO 并将其传递给计算着色器。 int ssbo = glGenBuffers(); FloatBuffer buff = BufferUtils.createFloatBuf
在着色器中指定“location = x”来指定着色器存储或统一缓冲区绑定(bind)点时,该数字可以是任何值吗?这个绑定(bind)点是否独立于当前绑定(bind)的着色器? 是否可以在绑定(bin
我有一个名为 sparseMatrix 的 SSBO 以及以下操作顺序: void callerFunc() { func1(); func2(); } /* Clear buffer
几天来,我一直在为计算着色器和缓冲区苦苦挣扎。我查看了它们的多个使用示例,例如“The OpenGL redbook 8th edition”和线程“OpenGL vertices in shader
在我的应用程序中,我添加了两盏灯。一个在 (0,0,2),第二个在 (2,0,0)。这是我得到的(x、y、z 轴分别由红色、绿色和蓝色线表示): 注意只有第一盏灯亮着,第二盏灯没亮。我使我的应用程序核
我有一个 SSBO,它存储屏幕上每个像素的 vec4 颜色值,并在主循环之前由计算着色器预先填充值。 我现在正在尝试在屏幕上获取这些数据,我猜这涉及使用片段着色器(尽管如果您知道更好的方法,我愿意接受
我试图通过一个非常基本的示例来弄清楚 SSBO 是如何工作的。顶点着色器: #version 430 layout(location = 0) in vec2 Vertex; void main()
我在着色器中向 SSBO 写入了一些顶点数据。然后我想将写入 SSBO 的数据用作 VBO。这些将用于下一次绘制调用。如何才能做到这一点? 这是,我现在是怎么做的,但它仍然是段错误: int new_
我有一个只有一个 int 的特殊 SSBO,我需要从着色器和 cpu 读取和写入。 我按如下方式创建了所述 SSBO: glGenBuffers(1, &ssbo); glBindBuffer(GL_
我正在尝试将一组 glm::uvec4 发送到我的 SSBO。有可能还是我应该使用其他方法? 我正在使用实例化绘图并告诉 OpenGL 绘制 X 个实例(取决于可以变化的 glm::uvec4 大小)
我可以同时将单个 opengl 缓冲区绑定(bind)到多个索引目标(SSBO 目标)吗? 例如,假设我的着色器有两个具有不同绑定(bind)索引的不同统一 block 。如果我需要的信息位于同一个缓
在 article on Imagination's website ,我已阅读以下段落: For example, there are no glUniform*() equivalent entr
我是一名优秀的程序员,十分优秀!