微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

一系列纹理性能影响

如何解决一系列纹理性能影响

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() 有多大影响吗?

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

此外,这些优化是至关重要的还是无关紧要的?


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

我为我的英语道歉。

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

texture(sampler2D(textures[inTexIndex],inUV)

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

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

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

解决方法

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

HLSL,从着色器模型 4 开始(因此 D3D10+)从未结合了图像/采样器。他们always used separate texture and sampler objects

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。