Было бы лучше отбросить текстуры массива и просто использовать текстурный атлас (или использовать текстуру массива с каждым слоем, содержащим множество субтекстур, но, как я покажу, это крайне не нужно).Если вы используете текстуры с таким низким разрешением, вы, вероятно, не используете линейную интерполяцию, так что вы можете легко избежать обтекания от соседних текселей.И даже если у вас есть проблемы с наложением, это можно легко исправить, добавив некоторое пространство между под-текстурами.
Даже если ваши под-текстуры должны быть 10x10, чтобы избежать наложения, 1024x1024текстура (минимальный размер GL 3.3 требует) дает вам 102x102 субтекстур, что составляет 10'404 текстур.Которого должно быть много.А если нет, то сделайте текстуру массива с таким количеством слоев, которое вам нужно.
Массивы сэмплеров не подойдут для вашей цели.Во-первых, вы не можете объявить неизмененный массив uniform
любого типа.Ну, вы можете, но вы должны переопределить его с размером в какой-то момент в вашем шейдере, так что нет смысла в объявлении без размера.Единственные невыразительные массивы, которые вы можете иметь, - это SSBO как последний элемент SSBO.
Второй, даже с размером, индекс, который вы используете для массивов непрозрачных типов должен быть динамически однородным .И поскольку вы пытаетесь нарисовать все грани кубов в одном вызове отрисовки, и каждая грань может иметь выбор из другого слоя, нет намерения, чтобы значение этого выражения было динамически однородным.
В-третьих, даже если бы вы сделали это с бесконтактным текстурированием , вы столкнулись бы с той же проблемой: если вы не используете аппаратное обеспечение NVIDIA, то выбранный вами сэмплер должен быть динамически однородным сэмплером.Что требует, чтобы индекс в массиве сэмплеров был динамически однородным.Который у вас нет.