当前位置: 首页 > 知识库问答 >
问题:

Vulkan忽略GLSL图像格式限定符

轩辕奕
2023-03-14

我有一个计算着色器,可以使用imageLoad读取带符号的标准化整数图像。

图像本身(包含正值和负值)被创建为R16G16_SNORM,并由先前gpass中的片段着色器写入。绑定到计算着色器中descriptorsetlayout绑定的imageview也使用相同的R16G16_SNORM格式创建。

一切正常。

昨天我意识到在计算着色器中我使用了错误的图像格式限定符rg16。有点困惑(我不明白它如何正确读取无符号规范化值)我更正为rg16_snorm,并且...什么都没变。

我做了几次测试(我甚至指定了一个rg16f),结果总是一样的(正确,[-1,1]签名)。

似乎Vulkan(至少我的实现)默默地忽略了任何图像格式限定符,并返回(我猜)到绑定到描述符集的Imageview格式。

这似乎符合imageview创建中有关格式的规范

format是一种VGFormat,描述用于解释图像中纹理块的格式和类型

但在附录A(SPIR-V的Vulkan环境——“SPIR-V图像格式和Vulkan格式之间的兼容性”)中,Rg16和RG16SNRM之间有明确的区别。。所以:

这是一个bug还是一个特性?

我正在使用ubuntu 20.04下的Nvidia 2070 Super

使现代化

初始图像写入操作是片段着色器颜色附件输出的结果,因此,没有descriptorsetlayout绑定声明。片段着色器将一个vec2输出到活动帧缓冲区和渲染过程指定的R16G16_SNORM颜色附件。

然后,计算着色器将结果图像(在相关屏障之后)作为图像/图像加载操作读取(正确,尽管布局限定符错误)。

请注意,验证层已启用且处于静默状态。

还要注意的是,使用rg16rg16frg16_snorm,结果值远不是随机的,并且与预期值(正和负)完全匹配。

共有1个答案

车胤运
2023-03-14

你得到的是未定义的行为。

对图像写入操作进行验证检查,以防止OpTypeImage的格式(相当于GLSL中的layout格式说明符)与备份VkImageView的格式不兼容:

如果OpTypeImage的图像格式与VkImageView的格式不兼容,则写入会导致图像内存的内容变得未定义。

请注意,当它说“兼容”时,并不意味着图像视图兼容;意思是“完全匹配”。您的OpTypeImage格式与着色器的格式不完全匹配,因此写入未定义。“undefined”的意思是“像指定了正确的格式一样工作”。

 类似资料:
  • 我正在迁移一个活动的Spring Web应用到Spring Boot(1.4.2)。 这些bean是在XML中定义的,因为它正在加载@重要资源。 我正在启动的4个bean是同一个对象BasicDataSource的实例。 为了告诉Spring要加载哪个,我为每个都设置了一个ID,并使用@Qualifer将正确的bean绑定到变量。 但Spring似乎忽略了我的@Qualifier,并抛出“没有可用

  • sqlcl在格式化缓冲区时似乎使用格式化规则,但在格式化文件时忽略它们。 我有一个输入文件(test.sql)和一小套格式化规则(format.xml) 显示应用于缓冲区而非文件的规则的sqlcl会话: 设置SQLFORMATPATH也不起作用:

  • 我如何用PHP中的正则表达式来实现这个 匹配此内容并忽略尺寸部分 请记住,300x200可以是任何东西,从4charsx4chars到1charx1chars

  • 问题内容: 什么是运行查询以便忽略字段中的空格的最佳方法?例如,以下查询: 将找到以下条目: 我正在使用php或python,但我认为这没有关系。 问题答案:

  • 我正在使用Apache POI解析Excel。是否可以让Apache POI将空字符串视为null并忽略它们? 可能有excel表将数百万个单元格设置为文本,如下所示,导致所有单元格被Apache POI解释为空字符串。由于有数百万个空的字符串单元格,逐个单元格地检查会导致严重的性能问题: 无论如何,Apache POI是否可以忽略这些空字符串单元格,这样我们就不必逐个单元格地单独读取单元格来检查