截至撰写日期,我在Win8.1上使用OpenGL 4.4的稀疏纹理。一切似乎工作正常,定期复制到已提交的区域。然而,当我尝试在稀疏纹理(混合提交/未提交区域)上做shader imageLoad/imageStore操作时,纹理到处乱了(值看起来混乱或像随机内存内容)。
扩展规范(https://www.opengl.org/registry/specs/ARB/sparse_texture.txt)声明所有shader和客户端读取未提交区域是未定义的,写入将被丢弃。然而,我找不到任何明确提及imageLoad imageStore的任何地方。它确实提到了FBO附件(我想避免,因为我使用计算着色器)。
关于图像加载/存储的稀疏纹理的正确行为是什么?
"对这些区域的写入将被忽略。GL可能会尝试写入未提交的区域,但这样做的效果将是良性的。"
显然"良性"的定义是值得争论的,除非你讨论的是imageLoad (...)
。尝试存储一些东西不会产生随机的垃圾,但是读取显然是没有定义的:
"从这些区域读取会产生未定义的数据,但除此之外没有不良影响。"
然而,我想借此机会指出,
GL_ARB_sparse_texture
在功能上是不完整的。许多在扩展中未定义的事情可以通过一对补充扩展来正确处理。
把它想象成Direct3D 11.2的平铺资源——根据硬件能力有多层支持。您在这里使用的ARB扩展是最低功能层,更高级的层是通过以下两个扩展实现的:
-
GL_ARB_sparse_texture2
-
GL_ARB_sparse_texture_clamp
如果您仔细阅读扩展#1,您正在讨论的场景具有良好定义的行为。
概述这个扩展建立在ARB_sparse_texture扩展的基础上,提供以下新功能:
提供了新的内置GLSL纹理查找和图像加载函数返回纹理是否被访问的信息
提供了新的内置GLSL纹理查找函数,指定a用于查找的最小详细级别,其中详细级别是自动计算的。这允许着色器避免访问当它知道无人居住的部分的高分辨率细节时被访问的内存是未填充的,或者是先验的知识或由反馈所提供的先前的返回值
读取未提交的纹理内存将作为这样的内存都是0;在之前,读取返回的值为定义。
扩展#2可能对您不感兴趣,因为您正在处理计算着色器