问题标签 [shader-storage-buffer]

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

opengl - 为多个着色器存储块重用绑定是否合法

假设我有一个着色器存储缓冲区,并希望有几个视图进入它,例如:

这是合法的 GLSL 吗? opengl.org说不:

两个块不能使用相同的索引。

但是,我在GL 4.5 Core SpecGLSL 4.50 Spec(或ARB_shader_storage_buffer_object 扩展描述)中找不到这样的语句,我的 NVIDIA 驱动程序似乎编译这样的代码没有错误或警告。

0 投票
0 回答
1308 浏览

opengl - GLSL:将可变长度缓冲区数组传递给函数

我有兴趣将可变长度数组(附加 SSBO)传递给函数,即:

编辑:扩展规范明确指出这是不受支持的(问题 #2 - https://www.opengl.org/registry/specs/ARB/shader_storage_buffer_object.txt)。因此,欢迎解决方法。

0 投票
1 回答
144 浏览

opengl - 只从着色器存储块中获取垃圾?

我已经绑定shader storage buffershader storage block这样的

mydata指向一个std::vector包含 4 个glm::vec3对象。

因为我绑定48 bytes了我期望lights[]持有的缓冲区范围48/(4*3) = 4 vec3s

1my中 index 处的元素std::vector保存数据x=1.0, y=1.0, z=1.0

但是通过执行查看输出

我看到黄色( x=1.0, y=1.0, z=0.0) 像素。这不是我加载到缓冲区中的内容。

有人可以告诉我我做错了什么吗?

编辑

我只是将着色器存储块更改为

和输出

它可以工作(白色像素)。

如果有人可以解释这一点,那仍然很棒。

0 投票
1 回答
156 浏览

c++ - 将 C++ 容器提供给 OpenGL?

我创建了一个着色器存储缓冲区对象来为我的顶点着色器提供信息。它绑定到包含单个结构的缓冲区。但有一个问题。我保存在这个结构中的数据不是一个简单的数组,它是一个std::vector.

这是结构:

mat4 只是一个简单的 4x4 浮点矩阵。

如果我把它交给 OpenGL,传输到 GPU 的数据将只是一堆指针和有关矩阵/向量的信息,而不是其中的数据。

一种解决方案是仅为 OpenGL 创建一个结构:

但是我必须复制与容器数据相对应的 eeeeevery 指针。

有更好的方法吗?

0 投票
1 回答
2345 浏览

opengl - 从计算着色器取回数据

我对opengl还很陌生,我发现自己需要从计算着色器中获取数据,但由于我错过了一些关键知识,我无法让它工作。所以我来到这里,也许你可以给我一些提示。

假设我有一个这样的计算着色器:

现在我想在我的应用程序中使用 trBuffer 的数据。我被告知要制作一个着色器存储缓冲区所以这就是我所做的:

然后这个:

其中 name = "TriangleBuffer" 和 index = 9

我知道如何访问我在应用程序中创建的 ssbo。我不知道如何将 TriangeBuffer 数据分配/传输到我的 ssbo。

0 投票
1 回答
1480 浏览

opengl - 计算着色器中的结构数组

在 OpenGL 中编写一个简单的计算着色器以了解它是如何工作的,但我无法获得想要的结果。

我想将一个结构数组 colourStruct 传递给我的计算着色器来为输出纹理着色。

当我的计算着色器中的“wantedColor”= 0 和绿色图像“wantedColor”= 1 时,我想有一个红色图像,蓝色表示 2。

但实际上,当“wantedColor”= 1 或 2 或 3 时,我只有红色,而当“wantedColor”> 2 时,我只有黑色......

如果有人有想法,或者我不理解计算着色器输入的想法。

感谢您的帮助,这是我的代码中有趣的部分。

我的计算着色器:

计算着色器和 SSBO 初始化:

0 投票
1 回答
1107 浏览

pointers - 指向计算着色器输入结构的指针

再一次,我的计算着色器有问题......我想将一个包含指针的结构传递给计算着色器。这是我的结构示例:

这是我的 SSBO 初始化:

我尝试了很多不同的初始化,但没有成功......

那么,有没有办法分配所有需要的内存(因为我知道在我的指针指向的每个数组中我需要的内存)并将其传递给计算着色器?还是真的不可能将指针传递给计算着色器?

谢谢您的帮助!

0 投票
1 回答
285 浏览

opengl - OpenGL 4.5 中每个着色器的资源大小限制

我遇到了一个奇怪的问题:我有一个片段着色器,其中包含几个统一变量(mat4、vec4)、一个 sampler2D 和一个巨大的 SSBO(1GB-2GB)。对于每种类型的变量,它都不会超过硬件的大小限制。没有 SSBO,着色器可以正常工作。使用 SSBO,如果纹理图像的分辨率较低(768x768x4 浮点数),着色器也可以正常工作。但是,如果分辨率达到 1024+ x 1024+,程序会立即在 NVIDIA 驱动程序中崩溃。我已经在 GTX980 Ti 和 Quadro P5000 上对其进行了测试。这个问题都发生了。

我想知道着色器资源的使用是否有任何限制。

0 投票
0 回答
3062 浏览

c++ - OpenGL 4.5 - 着色器存储缓冲区对象布局

我正在尝试使用着色器存储缓冲区对象(又名缓冲区块),但有几件事我没有完全掌握。我要做的是在其中存储不确定数量的灯光的(简化)数据n,以便我的着色器可以遍历它们并执行计算。

首先让我说我得到了正确的结果,并且没有来自 OpenGL 的错误。然而,它困扰我不知道它为什么工作

所以,在我的着色器中,我得到了以下信息:

在我的应用程序中:

在最后一个循环中,我存储了一个PointLightData结构,其偏移量等于它的大小乘以我已经存储的它们的数量(所以0第一个是偏移量)。

所以,正如我所说,一切似乎都是正确的。绑定点正确设置为零,我为我的对象分配了足够的内存等。图形结果还可以。

现在回答我的问题。我正在std430用作布局 - 事实上,如果我将其更改std140为我最初所做的那样,它就会中断。这是为什么?我的假设是std430着色器PointLights缓冲区块生成的布局与编译器为我的应用程序PointLightData结构生成的布局很匹配(正如您在该循环中看到的那样,我一个接一个地存储)。你认为是这样吗?

现在,假设我的假设是正确的,显而易见的解决方案是自己进行大小和偏移量的映射,用glGetUniformIndicesand查询opengl glGetActiveUniformsiv(后者用GL_UNIFORM_SIZEand调用GL_UNIFORM_OFFSET),但我偷偷怀疑这两个家伙只有使用统一块而不是像我正在尝试做的缓冲块。至少,当我执行以下操作时,OpenGL 会发脾气,给我一个1281错误并返回一个非常奇怪的数字作为索引(类似3432898282或其他):

我这样说是否正确glGetUniformIndices并且glGetActiveUniformsiv不适用于缓冲块?

如果他们不这样做,或者它工作的事实就像我想象的只是巧合,我怎么能手动进行映射?我检查了编程指南的附录 H,结构数组的措辞有些混乱。如果我无法查询 OpenGL 的大小/偏移量,我想我可以手动计算它们(虽然很麻烦),但我也很感激那里的一些帮助。

0 投票
1 回答
586 浏览

fragment-shader - OpenGL 4.5 - 着色器存储:写入顶点着色器,读取片段着色器

我的片段和顶点着色器都包含以下两个人:

我的问题是最后一个字段 ,fragPos是由顶点着色器计算的,但是片段着色器不到顶点着色器所做的更改fragPos(或根本没有任何更改):

...在哪里aLight循环lights[i]。正如您可以想象的那样,我正在计算要在阴影映射中使用的每个灯光的坐标系中顶点的位置。知道这里有什么问题吗?我在做一件根本错误的事情吗?

这是我初始化存储的方式:

可能值得注意的是,如果我在顶点着色器中移动fragPos到一个固定大小的数组变量,将结果留在那里,然后添加片段着色器对应项并将其用于我的其余部分,那么一切都很好。所以我想在这里了解更多的是为什么我的片段着色器看不到顶点着色器计算出来的数字。outout fragPos[2]in fragPos[2]