Позвольте мне показать вам, что я имею в виду под неправильной текстурой.
Сначала рисуется красный квадрат, затем зеленый, а затем синий. Все три нарисованы одной командой 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);
Кажется, что сбои пикселейИндекс из предыдущего экземпляра. Кроме того, они существуют только в первом треугольнике и чаще в верхней части, и они меняются в зависимости от того, где на экране я рисую квадраты.