问题标签 [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.
buffer - 大量元素时,Vulkan Buffer WorkGroupID 不返回实际值
为布局输入限定符创建一个带有pow(2, 24)
和 a的缓冲区将返回这一切都很好,因为它是零索引的。local_size_x = 64
WorkGroupID = 262143
pow(2,24) / 64 - 1
但是,如果我们增加问题的全局维度/无元素/大小,pow(2, 25)
可以说WorkGroupID
将无缘无故返回值,它们与数学不匹配。
以下是我认为很重要的设备的一些限制:
我不会过度分配设备支持的更多元素。所以在 2 天 + 16 小时后,我仍然不知道发生了什么......
WorkGroupSize
, WorkGroupID
,LocalInvocationID
并且GlobalInvocationID
当我达到否时会出现同样的问题。的元素。难怪GlobalInvocationID
由于它的计算方式会出现同样的问题......
opengl - 多重缓冲如何让程序更快
我对 OpenGL 中的多重缓冲有一些疑问。例如,我有一个程序。它做了以下事情:
- 进行深度预传递,并在着色器存储缓冲区上写入一些信息。
- 使用着色器存储缓冲区上的数据在默认帧缓冲区上绘制一些东西并交换缓冲区,所以我可以看到图片
因为我只创建了一个着色器存储缓冲区。GPU 无法执行下一个帧缓冲区的第 1 步“进行深度预传递”,直到最后一个帧缓冲区完成第 2 步“使用着色器存储缓冲区上的数据”。
这是真的吗?当 GPU 使用多缓冲(假设我在 GPU 上有足够的内存)时,如何有效地使用着色器存储缓冲区。
opengl - 如何从着色器内的着色器存储缓冲区对象获取 sampler2D 类型?
我试图在sampler2D
不使用统一变量的情况下将类型变量放入我的着色器中。
相反,我想使用着色器存储缓冲区对象 (SSBO) 将其移交。什么类型的变量必须在结构中声明才能移交?然后如何将这种类型投射到sampler2D
着色器中?
opengl - OpenGL:MAX_SHADER_STORAGE_BLOCK_SIZE 与 SSBO 大小的实际限制有何关系?
通过浏览 OpenGL 文档,我有点假设 MAX_SHADER_STORAGE_BLOCK_SIZE 是 SSBO 可能具有的实际大小限制。在我的 GPU 上,此值报告为 128 MB。但是,创建和使用更大的缓冲区(千兆字节)可以正常工作,只要它们适合视频内存。
几行代码来澄清:
在我的计算着色器中,缓冲区是通过
在 CPU 方面,我正在创建缓冲区
如前所述,让 pixelCounts 导致缓冲区大小远远超过 MAX_SHADER_STORAGE_BLOCK_SIZE...
那么,MAX_SHADER_STORAGE_BLOCK_SIZE 是否应该是实际的 SSBO 大小限制,而我的驱动程序(mesa radeonsi)只是报告了错误的数字,还是我误解了文档?难道没有明确调整大小的数组不计入 MAX_SHADER_STORAGE_BLOCK_SIZE 吗?
readonly - OpenGL ES 和 Spir-V 中的只读存储缓冲区
在 OpenGL ES 着色语言中,着色器存储缓冲区对象 (SSBO) 可以用限定符readonly
或writeonly
. OpenGL ES Shading Language 3.1 版规范
的第 4.9 节(内存访问限定符):
着色器存储块、在着色器存储块中声明的变量和声明为图像类型的变量(在其关键字中带有“image”的基本不透明类型)可以进一步使用以下一个或多个内存限定符进行限定:...(A table已列出)
所以我可以在 opengl es 着色器中有这样的东西:
但是如何在 spir-v中指定只读呢?
在spir-v 规范的 3.18 部分,访问限定符中,它说:
由 OpTypeImage 和 OpTypePipe 使用。
这是否意味着,在 spir-v 中,SSBO 不能指定为只读?我不认为 SSBO 属于 OpTypeImage 或 OpTypePipe 类型。
opengl - 使不同着色器程序中的着色器存储缓冲区可访问
我必须做哪些布局和绑定才能使(工作的)着色器存储缓冲区在第二个着色器程序中可读?我设置并填充了一个成功绑定并在几何着色器中使用的 SSBO。该着色器读取和写入该 SSBO - 到目前为止没有问题。那里没有进行渲染。
在下一步中,我的渲染通道(第二个着色器程序)应该可以访问这些数据。这个想法是拥有一个大数据集,而第二个程序的顶点着色器只使用每个渲染调用的一些索引来选择该 SSBO 的某些值。
我错过了一些特定的绑定命令还是我把它们放在了错误的位置?
两个程序的布局是否一致?我搞砸了实例吗?
我只是找不到在两个程序中使用的 SSBO 的任何示例..
创建、填充和绑定:
在几何着色器中实例化
另一个程序的顶点着色器中的第二个实例
实例是否相互对抗?现在我没有在渲染循环中发布我的绑定,因为我不确定我在那里做什么。我尝试在更改使用的程序之前/之后进行绑定;没有成功。
有人有想法吗?
编辑:我是否还必须将 SSBO 绑定到渲染循环之外的第二个程序?以不同于第一次绑定的方式?
编辑:虽然我没有解决这个特定的问题,但我发现了一种在 opengl 的意义上可能更多的解决方法。
我在第二个程序中使用了第一个程序的 SSBO 作为顶点属性。这和opengl的索引渲染功能解决了这个问题。
(这应该标记为已解决吗?)
opengl - 如何查询 SSBO 结构的对齐/步幅?
我不确定哪种结构布局最适合我的应用程序:shared
, packed
, std140
, std430
. 我不是要求对每一个进行解释,这些信息很容易找到,只是很难弄清楚每一个对供应商兼容性/性能的影响。如果shared
是默认值,我怀疑这是一个很好的起点。
据我所知,我必须在使用shared
or时查询对齐/偏移量packed
,因为它是特定于实现的。
查询它的 API 是什么?在绑定计算着色器时是否有一些参数glGetShaderiv
可以让我找出对齐方式?
opengl - 在初始化 SSBO 存储和填充它之间是否需要内存屏障?
我有如下代码:
我是否需要取消注释 glBufferData 和 glBufferSubData 之间的 glMemoryBarrier 调用?如果 SSBO 的东西不连贯,glBufferSubData 不可能在 glBufferData 之前通过,从而崩溃吗?
我的应用程序正在运行,但我不确定它是否只是侥幸。
opengl - 动态长度数组作为着色器存储缓冲区对象
假设我有一个动态数量的“球”,我想在我的 OpenGL 着色器中访问它们。在 C++ 中,数据可能是这样的:
如果我想在我的片段着色器中进行迭代all_balls
,我相信我需要一个着色器存储缓冲区对象。
该文档涉及数组,但明显不完整。
我假设我可以像这样将数据发送到缓冲区
在 GLSL 中,我如何指定缓冲区是一个数组,以及我的着色器如何知道这个数组的大小?
opengl-es - 我可以使 GLSL 结构具有 std140 布局吗?
我只是试着这样做
C++
GLSL 320 ES:
编译错误让我吃惊:
我找不到直接的答案,但我得到的印象是我无法为结构定义指定 std140。是这样吗?或者我该如何拼写?
如果不是,那么我如何保证我可以发送lights_array
到,glBufferData
以便它在着色器b_lights.data
数组中具有正确的布局?
换句话说,为什么std140
需要 thebuffer
而不是struct
?