在glBindImageTexture()
中,access
可以是GL_READ_ONLY
,GL_WRITE_ONLY
或GL_READ_WRITE
。
我假设这些应匹配GLSL中图像单元(例如readonly
或writeonly
)上的image2D
和imageBuffer
限定符。
设置readonly或writeonly(2013,NVIDIA 319.49驱动程序)时,我没有发现任何差异。当然,我可能不会做任何会导致减速的事情,因此看不到任何改善。当前的GL实现也可能忽略这些限定符。
缓存一致性会浮现在脑海中,但coherent
/ volatile
限定词是否已涵盖此问题?我已经使用了它们,它们似乎有效。
如果已经有好几年了,请不要害怕回复,我很有兴趣知道,我也确定其他人也是。
答案 0 :(得分:2)
它只告诉驱动程序应该如何使用内存。这取决于驱动程序是否进行优化。我没有看到NVidia驱动程序有任何区别。有一件事是肯定的,如果你用只读图像写,结果是不确定的。读取只写图像也是如此。但即使它对今天的驱动程序没有任何影响,你仍然应该使用它们与你实际对这些图像做的一致:未来的驱动程序可能会使用这些提示来优化内存访问。
答案 1 :(得分:2)
请注意,事实上没有实际执行这些访问策略。由于下面将要解释的原因,OpenGL故意将写入的行为保留为未定义的只读图像。除此之外,这允许在实现结束时具有很大的灵活性,以将只读属性用于许多不同的优化策略(将其视为提示而非严格规则)。由于行为未定义,您是对的,实施会忽略 ,但 不应 应用程序开发人员忽略了调用未定义的行为是一个定时炸弹。
为此,当您尝试将某些内容存储在只读映像中时,GLSL(或一般着色器)中不存在发出错误的机制,从而使执行此策略变得更加困难。您可能希望的最好的是在编译时进行某种静态分析,稍后在运行时根据绑定图像纹理的访问策略进行验证。这并不是说将来可能不会发生,但目前还没有这样的功能。 GLSL提供的唯一功能是编译时保证readonly
变量不能与着色器中的imageStore (...)
一起使用。简而言之,GLSL限定符在编译时强制执行,但绑定映像的访问策略不在运行时。
您没有看到任何性能提升这一事实并不令人惊讶。这是一个非常新的功能,你必须在驱动程序对访问策略做任何深刻的事情之前给它几年。只要你自己不违反它,它就不会伤害任何提示。