【问题标题】:OpenGL/GLSL faster way than imageStore() to set mutiple pixels of a texture?OpenGL/GLSL 比 imageStore() 更快的方式来设置纹理的多个像素?
【发布时间】:2013-08-21 17:54:21
【问题描述】:

我有一个迭代调度的计算着色器,它使用 2d 纹理来临时存储值。每个调用 id 访问纹理中的特定行。

问题是,这个纹理必须在每次着色器调度之前初始化为 0。

目前我在着色器代码末尾使用了一个循环,该循环使用 imageStore() 将相应行中的所有像素重置回 0。

for (uint i = 0; i < CONSTANT_SIZE; i++)
{  
     imageStore( myTexture, ivec2( i, global_invocation_id ), vec4( 0, 0, 0, 0) );          
} 

我想知道是否有更快的方法来做到这一点,一种通过一次调用(最好是整行)设置多个像素的方法?我查看了有关图像操作的 GLSL 4.3 规范,但找不到不需要特定像素位置的规范。

如果有更快的方法在 CPU 上实现这一点,我也会对此持开放态度,我已经尝试使用 glTexImage2D() 重新缓冲纹理,但是对于每个使用 imageStore 并没有任何明显的性能变化单个像素。

【问题讨论】:

  • 你的意思是“着色器调用”吗?
  • 我可能用错了这个词。 “在每次着色器调用结束时”应更改为“在着色器代码结束时”。我进行了编辑。
  • 你能发布你的着色器代码吗?

标签: opengl input textures glsl


【解决方案1】:

“更快的方法”是从 OpenGL 中清除纹理,而不是在着色器中。 4.4 提供了direct texture clearing function,但即使是通过 glTexSubImage2D (当然是在屏障之后)进行像素传输这样简单的事情也可能比您正在做的更快。

或者,如果您使用此纹理只是为了调用暂存内存...您为什么要使用 纹理?最好使用shared variables。只需创建一个 vec4 数组数组,其中每个本地调用访问一个数组数组。访问这些内容的加载速度会更快。

给定 32KB 的共享变量存储空间(允许的最低限度),如果每个工作组有 8 次调用,那么每个工作组有 4KB 的空间可供使用。这让每个人都有 256 个vec4s 可以玩。如果最多移动 16 次调用,则会将其减少到 128 vec4s。

【讨论】:

  • 我最初想使用共享变量,甚至只是局部变量,因为调用永远不需要访问另一个临时数据。我的问题是,目前这个临时数据每次调用大约 16kb。使用我的实现(似乎是 64kb),它为每个工作组提供了 4 次调用,与我之前使用纹理存储/加载的 1 个大小为 256 的工作组相比,这导致性能大大降低。有没有比共享变量更大但比纹理更快的临时存储形式?我应该研究 SSBO 吗?
猜你喜欢
  • 2011-06-14
  • 2011-12-06
  • 2021-05-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-03-20
  • 2013-10-05
  • 1970-01-01
相关资源
最近更新 更多