Почему некоторые пиксели сэмплируют неверную текстуру во фрагментном шейдере? - PullRequest
0 голосов
/ 03 ноября 2019

Позвольте мне показать вам, что я имею в виду под неправильной текстурой.

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);

Кажется, что сбои пикселейИндекс из предыдущего экземпляра. Кроме того, они существуют только в первом треугольнике и чаще в верхней части, и они меняются в зависимости от того, где на экране я рисую квадраты.

1 Ответ

1 голос
/ 04 ноября 2019

gl_InstanceIndex не обязательно будет динамически однородным . Если ваш вызов отрисовки рисует только один экземпляр, то его значение будет динамически однородным. Но если ваш вызов отрисовки включает в себя несколько экземпляров, он не будет.

Вы не можете индексировать массив текстур со значением, которое не является динамически однородным. Если вам необходимо произвести выборку на основе индекса, используйте текстуру массива (sampler2DArray) и передайте textureIndex в качестве индекса массива.

...