为什么某些像素在片段着色器中采样错误的纹理?
Why some pixels sample wrong texture in fragment shader?
让我告诉你我所说的错误纹理是什么意思。
先绘制红色方块,然后绘制绿色方块,然后绘制蓝色方块。
所有三个都是使用单个命令 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);
失败的像素似乎是从上一个实例中获取索引。此外,它们仅存在于第一个三角形中,更频繁地出现在顶部,并且它们会根据我在屏幕上绘制正方形的位置而变化。
gl_InstanceIndex
不保证是 dynamically uniform。如果您的绘制调用只绘制一个实例,那么它的值将是动态统一的。但是,如果您的绘图调用包含多个实例,则不会。
您不能使用非动态统一的值索引纹理数组。如果您需要根据索引进行采样,则使用数组纹理 (sampler2DArray
) 并传递 textureIndex
作为它的数组索引。
让我告诉你我所说的错误纹理是什么意思。
先绘制红色方块,然后绘制绿色方块,然后绘制蓝色方块。
所有三个都是使用单个命令 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);
失败的像素似乎是从上一个实例中获取索引。此外,它们仅存在于第一个三角形中,更频繁地出现在顶部,并且它们会根据我在屏幕上绘制正方形的位置而变化。
gl_InstanceIndex
不保证是 dynamically uniform。如果您的绘制调用只绘制一个实例,那么它的值将是动态统一的。但是,如果您的绘图调用包含多个实例,则不会。
您不能使用非动态统一的值索引纹理数组。如果您需要根据索引进行采样,则使用数组纹理 (sampler2DArray
) 并传递 textureIndex
作为它的数组索引。