1

截至撰写本文时,我在 Win8.1 最新的 NV 驱动程序上使用 OpenGL 4.4 的稀疏纹理。一切似乎都可以正常复制到已提交区域中。但是,当我尝试对稀疏纹理(具有混合的已提交/未提交区域)进行着色器 imageLoad/imageStore 操作时,纹理会到处乱七八糟(值看起来很混乱或像随机内存内容)。

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

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

4

1 回答 1

1

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

显然,除非您在讨论,否则“良性”imageLoad (...)的定义是有争议的。尝试存储一些东西不会产生随机垃圾,但读取很明显是未定义的:

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


然而,我想借此机会指出,这GL_ARB_sparse_texture在功能上是不完整的。给定一对补充扩展,许多在该扩展中未定义的事情都得到了妥善处理。

这就像 Direct3D 11.2 的平铺资源 -根据硬件功能,有多个支持层。您在此处使用的 ARB 扩展是最小功能层,而更高级的层是通过以下两个扩展实现的:

  1. GL_ARB_sparse_texture2
  2. GL_ARB_sparse_texture_clamp

如果您阅读扩展#1,您正在讨论的场景具有明确定义的行为。

概述

此扩展基于 ARB_sparse_texture 扩展,提供以下新功能:

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

  • 提供了新的内置 GLSL 纹理查找函数,这些函数指定了用于自动计算详细程度的查找的最低详细程度。这允许着色器在知道所访问的内存未填充时避免访问高分辨率细节级别的未填充部分,无论是从先验知识还是从先前执行的“稀疏”纹理查找函数的返回值提供的反馈。

  • 读取未提交的纹理内存将表现得好像这些内存被零填充了一样;以前,读取返回的值是未定义的。

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

于 2015-08-17T23:37:10.780 回答