我在撰写之日起在Win8.1最新的NV驱动程序上使用稀疏纹理和OpenGL 4.4。一切似乎都可以正常复制到已提交的区域。然而,当我尝试对稀疏纹理(具有混合的提交/未提交区域)执行着色器imageLoad / imageStore操作时,纹理会在整个地方混乱(值看起来很混乱或像随机内存一样)。
扩展规范(https://www.opengl.org/registry/specs/ARB/sparse_texture.txt)声明所有着色器和客户端读取未注释区域都是未定义的,并且写入被丢弃。但是我无法在任何地方找到任何有关imageLoad imageStore的明确提及。它确实提到了FBO附件(我想避免使用计算着色器)。
关于图像加载/存储的稀疏纹理的正确行为是什么?
答案 0 :(得分:1)
“忽略对这些区域的写入.GL可能会尝试写入未提交的区域,但这样做的效果将是良性的。”
除非您正在讨论imageLoad (...)
,否则显然“良性”的定义有争议。尝试存储某些内容不会产生随机垃圾,但读取非常明确:
“从这些区域读取产生未定义的数据,但不会产生任何不利影响。”
但是,我想借此机会指出,GL_ARB_sparse_texture
在功能上是不完整的。在扩展中未定义的许多内容都可以通过一对补充扩展来正确处理。
将此视为Direct3D 11.2的平铺资源 - 根据硬件功能有multiple tiers of support。您在此处使用的ARB扩展是最低功能层,通过以下两个扩展实现更高级的层:
GL_ARB_sparse_texture2
GL_ARB_sparse_texture_clamp
如果您阅读了扩展#1,那么您正在讨论的场景具有明确定义的行为。
概述
此扩展基于ARB_sparse_texture扩展,提供 遵循新功能:
提供了新的内置GLSL纹理查找和图像加载功能 返回有关纹理是否访问的纹素的信息 查找未访问的未提交纹理内存。
提供了新的内置GLSL纹理查找功能,用于指定 用于查找详细程度的最低详细程度 是自动计算的。这允许着色器避免访问 当它知道时,无人居住的高分辨率细节部分 所访问的内存是未填充的,要么是先验的 知识或来自先前返回值的反馈 执行“稀疏”纹理查找功能。
读取未提交的纹理内存将充当这样的内存 充满了零;以前,读取返回的值是 未定义。强>
扩展#2可能对您不感兴趣,因为您正在处理计算着色器。