为什么某些像素在片段着色器中采样了错误的纹理?

问题描述 投票:0回答:1

让我告诉您错误的纹理是什么意思。

enter image description here

首先绘制红色正方形,然后绘制绿色,然后绘制蓝色。所有三个都是使用单个命令vkCmdDrawIndirect绘制的。我有一个统一的缓冲区,该缓冲区在顶点着色器中公开。它包含一个结构数组(每个实例绘制一个)。我从结构中获取给定实例的纹理索引。我使用layout(location = 2)将其传递给片段着色器,以避免为片段着色器使用另一个统一缓冲区:

layout(binding = 0) uniform UniformBufferObject {
    camera cam;
    transform t[10000];
} ubo;

layout(location = 2) out flat int textureIndex;
...
// in main
textureIndex = ubo.t[gl_InstanceIndex].textureInstance;

在片段着色器中,我有这个:

layout(location = 2) in flat int textureIndex;
layout(binding = 2) uniform texture2D sampledImage[40]; // descriptor with max 40 textures
...
// in main
outColor = texture(sampler2D(sampledImage[textureIndex],texSampler), fragTexCoord);

失败的像素似乎从前一个实例获取索引。此外,它们仅存在于第一个三角形中,并且更频繁地出现在顶部,并且它们会根据我在屏幕上绘制正方形的位置而变化。

shader vulkan
1个回答
0
投票

gl_InstanceIndex不能保证是dynamically uniform。如果您的绘制调用仅绘制一个实例,那么其值将是动态统一的。但是,如果您的绘图调用包含多个实例,则不会。

您无法索引具有动态非均匀值的纹理数组。如果需要基于索引进行采样,请使用数组纹理(sampler2DArray)并将textureIndex作为其数组索引。

© www.soinside.com 2019 - 2024. All rights reserved.