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

动态索引到sampler2D的统一数组不起作用

冯元徽
2023-03-14

我需要索引到2个均匀采样的数组中。索引是每帧动态的。也就是说,我有一个动态统一缓冲区,它为片段着色器提供索引。我使用Vulkan API 1.2。在设备功能列表中,我有:

shaderSampledImageArrayDynamicIndexing = 1

我不确定100%,但看起来这个功能是1.2中的核心。尽管如此,我确实尝试在设备创建期间启用它,如下所示:

       VkPhysicalDeviceFeatures features = {}; 
       features.shaderSampledImageArrayDynamicIndexing = VK_TRUE;
     

然后插入设备创建:

    VkDeviceCreateInfo deviceCreateInfo = {};
    deviceCreateInfo.sType = VK_STRUCTURE_TYPE_DEVICE_CREATE_INFO;
    deviceCreateInfo.pQueueCreateInfos = queueCreateInfos;
    deviceCreateInfo.queueCreateInfoCount = 1;
    deviceCreateInfo.pEnabledFeatures = &features ;
    deviceCreateInfo.enabledExtensionCount = NUM_DEVICE_EXTENSIONS;
    deviceCreateInfo.ppEnabledExtensionNames = deviceExtensionNames;

在着色器中,它如下所示:

   layout(std140,set=0,binding=1)uniform Material
   {
    vec4   fparams0;
    vec4   fparams1; 
    uvec4  iparams; //.z - array texture idx
    uvec4  iparams1;
   }material;


   layout (set=1,binding = 0)uniform sampler2D u_ColorMaps[2];
   layout (location = 0)in vec2 texCoord;
   layout(location = 0) out vec4 outColor;
   void main()
   {

      outColor  =  texture(u_ColorMaps[material.iparams.z],texCoord);
     
   }
   

我得到的是一些奇怪颜色的图像像素组合。如果我改为固定索引,它会正常工作<代码>材料。iParms。zparam已被验证,它每帧(0或1)提供正确的索引号。不知道还缺什么。验证层什么也没说。

Mys设置:Windows、RTX3000、NVIDIA beta驱动程序443.41(Vulkan 1.2)

更新:

我还发现,动态索引采样器在红色通道(r)中返回一个接近1的值,在GB中返回0。我不会设置红色,而且我获取的纹理也不包含红色。这里有两个结果,上面的结果是正确的,这是我在用常量值进行索引时得到的结果。第二个问题是当我使用动态UBO中的动态uint进行索引时会发生什么:

共有1个答案

萧宣
2023-03-14

问题是由于使用了Y′CBCR取样器。似乎Vulkan不允许动态索引到这些制服的数组中。

以下是Vulkan规格说明:

如果组合图像采样器启用采样器Y CBCR转换或对次采样图像进行采样,则在着色器代码中聚合到数组时,必须仅通过常量积分表达式对其进行索引,而不管着色器的着色器特性如何。

所以,我的解决方案是提供两个单独绑定的采样器,并使用if()的动态索引。。其他条件决定使用哪种采样器。Push常量也可以工作,但在这种情况下,我必须一直重新记录命令缓冲区。希望这些信息能对其他使用Vulkan API视频格式的人有所帮助。

 类似资料:
  • 问题内容: 我试图让MongoDB根据其索引检测重复值。我认为这在MongoDB中是可能的,但是通过Mongoose包装器,事情似乎被打破了。所以对于这样的事情: 我可以用同一封电子邮件保存2个用户。真是 在这里也表达了同样的问题:https : //github.com/LearnBoost/mongoose/issues/56,但是该线程很旧,导致无处可去。 现在,我正在手动调用数据库以查找用

  • 问题内容: 我正在围绕ElasticSearch的管理客户端编写一个简单的Java包装器。为了测试它,我有一个主要方法,该方法首先检查索引是否存在(IndicesExistsRequest),如果存在则将其删除(DeleteIndexRequest),然后再次创建索引。请参见下面的代码。但是我一直得到IndexAlreadyExistsException。 顺便说一句,我正在尝试为您从命令提示符启

  • 问题内容: 我知道我在此代码的某个地方犯了一个错误,但我无法弄清楚。player1.getId(); 返回值1只是为了使您知道。我正在尝试打印值为1的数组的索引。在代码的结尾,我希望currentX为0,currentY为0,但它们都是9。任何帮助都是超级的。 问题答案: 删除结尾处的分号() 考虑一下Java语句的工作方式 在Java的声明如果表达式执行它的代码块声明。半冒号结束Java语句。如

  • 我想知道我是否可以用我绘制的顶点中包含的值索引到一个统一的缓冲区数组中,比如: 我的理解是这是不可能的因为 很可能不是'动态统一表达式',并且根据留档不能用于索引到统一缓冲区数组中: 在某些地方,GLSL要求表达式是动态统一的。以下所有内容都必须使用动态统一的表达式: 然而,我遇到了来自同一个来源的信息,关于如何访问一系列拥有“无绑定纹理”纹理手柄的采样器,它说(我的重点是): 默认块统一变量中使

  • 问题内容: 我有一种情况,在使用网络应用程序时,我需要显示动态图像。我想显示图像文件名存储在变量中的位置。该变量是一个属性,它返回一个存储变量,该变量在上异步填充。 但是,当我刚这样做时,它会完美地工作: 正确的方法应该是什么? 问题答案: 我通过以下代码来工作 并在HTML中: 但是不确定为什么我以前的方法行不通。

  • 问题内容: 表结构: 总行数: 137967 带有更多表联接的真实查询要更长得多,关键是,我无法使表使用索引。如果要选择特定日期之前的所有数据,这对我来说将很难。但是,我注意到,如果选择较小的数据子集,则可以使MySQL使用索引。 那么,无论我放置什么日期,该如何确保MySQL将使用索引? 问题答案: 一切都按预期进行。:) 有索引可以加快检索速度。他们使用索引查找来完成。 在你第一次查询中不使用