带图像加载/存储的GL_ARB_SPARSE_TEXTURE

时间:2015-08-17 22:57:08

标签: opengl opengl-4 compute-shader

我在撰写之日起在Win8.1最新的NV驱动程序上使用稀疏纹理和OpenGL 4.4。一切似乎都可以正常复制到已提交的区域。然而,当我尝试对稀疏纹理(具有混合的提交/未提交区域)执行着色器imageLoad / imageStore操作时,纹理会在整个地方混乱(值看起来很混乱或像随机内存一样)。

扩展规范(https://www.opengl.org/registry/specs/ARB/sparse_texture.txt)声明所有着色器和客户端读取未注释区域都是未定义的,并且写入被丢弃。但是我无法在任何地方找到任何有关imageLoad imageStore的明确提及。它确实提到了FBO附件(我想避免使用计算着色器)。

关于图像加载/存储的稀疏纹理的正确行为是什么?

1 个答案:

答案 0 :(得分:1)

  

“忽略对这些区域的写入.GL可能会尝试写入未提交的区域,但这样做的效果将是良性的。”

除非您正在讨论imageLoad (...),否则显然“良性”的定义有争议。尝试存储某些内容不会产生随机垃圾,但读取非常明确:

  

“从这些区域读取产生未定义的数据,但不会产生任何不利影响。”

但是,我想借此机会指出,GL_ARB_sparse_texture在功能上是不完整的。在扩展中未定义的许多内容都可以通过一对补充扩展来正确处理。

将此视为Direct3D 11.2的平铺资源 - 根据硬件功能有multiple tiers of support。您在此处使用的ARB扩展是最低功能层,通过以下两个扩展实现更高级的层:

  1. GL_ARB_sparse_texture2
  2. GL_ARB_sparse_texture_clamp
  3. 如果您阅读了扩展#1,那么您正在讨论的场景具有明确定义的行为。

      

    概述

         
        

    此扩展基于ARB_sparse_texture扩展,提供         遵循新功能:

             
          
    • 提供了新的内置GLSL纹理查找和图像加载功能         返回有关纹理是否访问的纹素的信息         查找未访问的未提交纹理内存。

    •     
    • 提供了新的内置GLSL纹理查找功能,用于指定         用于查找详细程度的最低详细程度         是自动计算的。这允许着色器避免访问         当它知道时,无人居住的高分辨率细节部分         所访问的内存是未填充的,要么是先验的         知识或来自先前返回值的反馈         执行“稀疏”纹理查找功能。

    •     
    • 读取未提交的纹理内存将充当这样的内存         充满了零;以前读取返回的值是         未定义。

    •     
      

    扩展#2可能对您不感兴趣,因为您正在处理计算着色器。