Есть ли обходной путь для увеличения GL_MAX_ARRAY_TEXTURE_LAYERS? - PullRequest
0 голосов
/ 25 октября 2018

Я использую массив текстур для рендеринга ландшафта вокселей в стиле Minecraft.Это работает фантастически, но я недавно заметил, что GL_MAX_ARRAY_TEXTURE_LAYERS намного меньше, чем GL_MAX_TEXTURE_SIZE.

Мои текстуры очень маленькие, 8x8, но мне нужно иметь возможность поддерживать рендеринг из массива от сотен до тысячиз них;Мне просто нужно, чтобы GL_MAX_ARRAY_TEXTURE_LAYERS было больше.

OpenGL 4.5 требует, чтобы GL_MAX_ARRAY_TEXTURE_LAYERS было не менее 2048, чего может быть достаточно , но мое приложение ориентировано на OpenGL 3.3, что гарантирует только 256+.

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

Я смотрел, может ли помочь ARB_sparse_texture, но GL_MAX_SPARSE_ARRAY_TEXTURE_LAYERS_ARB совпадает с GL_MAX_ARRAY_TEXTURE_LAYERS;это расширение - просто обходной путь для использования VRAM, а не использования слоев.

Могу ли я просто получить доступ к своему шейдеру GLSL из массива из sampler2DArray?GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS должно быть не менее 80+, поэтому 80+ * 256+ = 20480+, и этого будет достаточно для моих целей.Итак, теоретически я мог бы сделать что-то вроде этого?

const int MAXLAYERS = 256;
vec3 texCoord;
uniform sampler2DArray[] tex;
void main()
{
    int arrayIdx = int(texCoord.z + 0.5f) / MAXLAYERS  256
    float arrayOffset = texCoord.z % MAXLAYERS;
    FragColor = texture(tex[arrayIdx],
        vec3(texCoord.x, texCoord.y, arrayOffset));
}

1 Ответ

0 голосов
/ 25 октября 2018

Было бы лучше отбросить текстуры массива и просто использовать текстурный атлас (или использовать текстуру массива с каждым слоем, содержащим множество субтекстур, но, как я покажу, это крайне не нужно).Если вы используете текстуры с таким низким разрешением, вы, вероятно, не используете линейную интерполяцию, так что вы можете легко избежать обтекания от соседних текселей.И даже если у вас есть проблемы с наложением, это можно легко исправить, добавив некоторое пространство между под-текстурами.

Даже если ваши под-текстуры должны быть 10x10, чтобы избежать наложения, 1024x1024текстура (минимальный размер GL 3.3 требует) дает вам 102x102 субтекстур, что составляет 10'404 текстур.Которого должно быть много.А если нет, то сделайте текстуру массива с таким количеством слоев, которое вам нужно.

Массивы сэмплеров не подойдут для вашей цели.Во-первых, вы не можете объявить неизмененный массив uniform любого типа.Ну, вы можете, но вы должны переопределить его с размером в какой-то момент в вашем шейдере, так что нет смысла в объявлении без размера.Единственные невыразительные массивы, которые вы можете иметь, - это SSBO как последний элемент SSBO.

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

В-третьих, даже если бы вы сделали это с бесконтактным текстурированием , вы столкнулись бы с той же проблемой: если вы не используете аппаратное обеспечение NVIDIA, то выбранный вами сэмплер должен быть динамически однородным сэмплером.Что требует, чтобы индекс в массиве сэмплеров был динамически однородным.Который у вас нет.

...