【问题标题】:Why some pixels sample wrong texture in fragment shader?为什么有些像素在片段着色器中采样错误的纹理?
【发布时间】:2019-11-03 19:45:01
【问题描述】:

让我告诉你我所说的错误纹理是什么意思。

先绘制红色方块,然后是绿色,最后是蓝色。 这三个都是使用单个命令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】:

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

    您不能使用非动态统一的值来索引纹理数组。如果您需要基于索引进行采样,则使用数组纹理 (sampler2DArray) 并将textureIndex 作为数组索引传递给它。

    【讨论】:

    • 所以我的textureIndex 不适用于纹理数组,但可以用于纹理数组?
    • 我启用了VK_EXT_descriptor_indexingshaderSampledImageArrayNonUniformIndexing,现在我可以使用非统一变量进行索引了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-17
    • 1970-01-01
    • 2015-05-13
    相关资源
    最近更新 更多