love.graphics.newArrayImage
Доступно начиная с LÖVE 11.0
Эта функция не поддерживается в более ранних версиях.
Создаёт новый массивный массив изображений.
Не все системы поддерживают массивные изображения. Используйте love.graphics.getTextureTypes для проверки!
Эта функция может быть медленной, если её вызывать многократно, например, из love.update или love.draw. Если вам нужно использовать определённый ресурс часто, создайте его один раз и сохраните для повторного использования!
Массивное изображение/текстура — это один объект, содержащий несколько «слоёв» или «фрагментов» 2D подизображений. Его можно представить аналогично атласу текстур или спрайт-листу, но он не страдает от тех же артефактов наложения плиток/квадратов, что и атласы текстур — хотя каждое подизображение должно иметь одинаковые размеры.
Конкретный слой массивного изображения можно отрисовать с помощью love.graphics.drawLayer / SpriteBatch:addLayer, или с помощью варианта Quad функции love.graphics.draw и Quad:setLayer, или через пользовательскую шейдерную функцию.
Для использования массивного изображения в шейдере, оно должно быть объявлено как тип ArrayImage или sampler2DArray (вместо Image или sampler2D). Функция шейдера Texel(ArrayImage image, vec3 texturecoord) должна использоваться для получения цветовых значений пикселей из фрагмента массивного изображения. Аргумент vec3 содержит координату текстуры в первых двух компонентах и индекс фрагмента с нулевым значением в третьем компоненте.
Функция
Создаёт массивное изображение, используя разные файлы изображений для каждого фрагмента результирующего массивного изображения.
Синтаксис
image = love.graphics.newArrayImage( slices, settings )
Аргументы
table slices- Таблица, содержащая пути к файлам изображений (или файлы, данные файла, данные изображения или сжатые данные изображения) в массиве. Каждое подизображение должно иметь одинаковые размеры. Также может быть передана таблица таблиц, где каждая подтаблица содержит все уровни mipmap для индекса фрагмента этой подтаблицы.
table settings (nil)- Необязательная таблица настроек для конфигурации массивного изображения, содержащая следующие поля:
boolean mipmaps (false)- True для использования mipmap, false — для отключения. Mipmap будут автоматически сгенерированы, если изображение не в формате сжатой текстуры.
boolean linear (false)- True для обработки пикселей изображения как линейных, а не sRGB, когда включена коррекция гаммы. Большинство изображений создаются как sRGB.
number dpiscale (1)- Масштаб DPI для использования при отрисовке массивного изображения и вызове getWidth/getHeight.
Возвращаемые значения
Image image- Объект массивного изображения.
Примечания
Иллюстрация работы с массивным изображением: [1]
Масштаб DPI 2 (удвоение обычной плотности пикселей) приведет к тому, что изображение займет на экране то же место, что и изображение с половиной своих пиксельных размеров с масштабом DPI 1. Это позволяет легко заменять изображения, занимающие одинаковое место на экране, но имеющие разную плотность пикселей, что упрощает поддержку разрешений высокой плотности пикселей (retina) с меньшим объёмом кода.
Для использования массивной текстуры или других типов текстур, не являющихся 2D, как основной текстуры в пользовательском шейдере, необходимо использовать вариант void effect() в шейдере пикселей, и MainTex необходимо объявить как ArrayImage или sampler2DArray следующим образом: uniform ArrayImage MainTex;.
Примеры
Отрисовка нескольких слоёв массивного изображения
function love.load()
local sprites = {"sprite1.png", "sprite2.png"}
image = love.graphics.newArrayImage(sprites)
end
function love.draw()
love.graphics.drawLayer(image, 1, 50, 50)
love.graphics.drawLayer(image, 2, 250, 50)
end
Использование пользовательского шейдера с love.graphics.drawLayer
shader = love.graphics.newShader[[
uniform ArrayImage MainTex;
void effect() {
// Texel uses a third component of the texture coordinate for the layer index, when an Array Texture is passed in.
// love sets up the texture coordinates to contain the layer index specified in love.graphics.drawLayer, when
// rendering the Array Texture.
love_PixelColor = Texel(MainTex, VaryingTexCoord.xyz) * VaryingColor;
}
]]
function love.load()
local sprites = {"sprite1.png", "sprite2.png"}
image = love.graphics.newArrayImage(sprites)
end
function love.draw()
love.graphics.setShader(shader)
love.graphics.drawLayer(image, 1, 50, 50)
love.graphics.drawLayer(image, 2, 250, 50)
end
См. также
© 2006–2020 LÖVE Development Team
Licensed under the GNU Free Documentation License, Version 1.3.
https://love2d.org/wiki/love.graphics.newArrayImage