gpt4 book ai didi

OpenGL/GLSL 比 imageStore() 更快的方式来设置纹理的多个像素?

转载 作者:行者123 更新时间:2023-12-04 04:44:46 34 4
gpt4 key购买 nike

我有一个迭代调度的计算着色器,并使用 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 中清除纹理,而不是在您的着色器中。 4.4 提供了direct texture clearing function ,但即使是通过 glTexSubImage2D(当然是在障碍之后)这样简单的像素传输也可能比你正在做的更快。

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

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

关于OpenGL/GLSL 比 imageStore() 更快的方式来设置纹理的多个像素?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18364443/

34 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com