【问题标题】:Array of textures performance impact纹理阵列性能影响
【发布时间】:2021-07-18 00:59:06
【问题描述】:

按照Kyle Halladay's tutorial on "Using Arrays of Textures in Vulkan Shaders",我设法让我的代码工作。

在某些时候,凯尔说:

“我不知道在 sampler2DArray 上使用纹理数组会付出多少(如果有的话)性能损失。” (引)

我担心性能。这是着色器:

#version 450
#extension GL_ARB_separate_shader_objects : enable

layout(binding = 1) uniform sampler baseSampler;
layout(binding = 2) uniform texture2D textures[2];

layout(location = 0) in vec2 inUV;
layout(location = 1) flat in vec4 inTint;
layout(location = 2) flat in uint inTexIndex;

layout(location = 0) out vec4 outColor;

void main()
{
    outColor = inTint * texture(sampler2D(textures[inTexIndex], baseSampler), inUV);
}

我关心的部分是sampler2D(textures[inTexIndex], baseSampler),看起来sampler2D是基于baseSampler设置的。这看起来很可怕,我不知道它是否是每个片段,或者glslc 是否可以以某种方式优化它。

有人知道sampler2D() 的影响有多大吗?

在 cmets 中收到答案的过时问题:如果我绑定 VkSampler 描述符 (VK_DESCRIPTOR_TYPE_SAMPLER) 数组来代替 VkImageView 描述符 (VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE) 会怎样?着色器不会索引到 texture2D 数组,而是索引到带有附加 ImageInfo(纹理)的 sampler2D 数组。

此外,这些优化是关键还是无关紧要?


编辑:在不改变含义的情况下清理了原始问题,在下面添加了相同/推论的问题,并且措辞更好。

我为我的英语道歉。

这段特定的代码有什么作用:

texture(sampler2D(textures[inTexIndex], baseSampler), inUV)

这是按片段执行的吗?如果是这样,sampler2D() 是一个函数吗?类型转换?分配内存的构造函数?这个“功能”是我最关心的。我认为索引是不可避免的。

在评论中,我想知道是否可以使用VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER 描述符并在着色器中使用sampler2D 数组。这种选择会提高性能吗?

最后,我想知道切换到sampler2Darray 是否真的有很大的不同(性能方面)。

【问题讨论】:

  • "着色器不会索引到 texture2D 数组,而是索引到带有附加 ImageInfo(纹理)的 sampler2D 数组。" 不,那将是一个 @987654339 数组@。 sampler2D 是 2D 纹理 + 采样器对象。 sampler 只是采样器,根本没有纹理。 GLSL 中的 sampler 映射到 VK_DESCRIPTOR_TYPE_SAMPLER
  • 那么VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER 呢?它是否映射到sampler2D?关于性能或每个片段会发生什么的任何提示?在“C++ 演讲”中,它是像 new Sampler2D() 的实例化还是更像是一个演员 (sampler2D)
  • 我使用 renderdoc 来粗略检查着色器需要多少时间。此外,采样器是决定如何进行采样的状态,纹理是内存,即完成采样的图像。 texture() 需要两者都知道,因此将它们组合成一个 sampler2D。它如何发生可能取决于实现。是的,组合图像采样器是 sampler2D。
  • 目前尚不清楚您所说的是哪一方面。您是在谈论使用单独的纹理和采样器状态(即:不是COMBINED_IMAGE_SAMPLER),还是在谈论从数组中索引纹理的成本?
  • @NicolBolas 感谢您抽出宝贵时间。我在这里和 Khronos 论坛上看到你很忙,所以我知道每一秒都很重要。感谢您为社区贡献的每一滴金币 :)

标签: glsl vulkan fragment-shader texture2d


【解决方案1】:

不使用组合图像/采样器对象的成本当然取决于硬件。但是,请考虑一下。

HLSL,从 Shader Model 4 开始(所以 D3D10+)从来没有组合过图像/采样器。他们有always used separate texture and sampler objects

因此,如果整个 API 已经这样做了十多年,可以肯定地说这不会是性能问题。

【讨论】:

    猜你喜欢
    • 2013-12-28
    • 1970-01-01
    • 2018-03-09
    • 1970-01-01
    • 2017-09-06
    • 1970-01-01
    • 2012-04-18
    • 2016-05-17
    • 2015-04-08
    相关资源
    最近更新 更多