【发布时间】: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