Пороговая обработка изображений в LUA - LOVE

Чтобы иметь только одно входное изображение для эффекта «подобного распространению», я хотел бы выполнить некоторую пороговую операцию над некоторыми объектами для рисования или найти какой-либо другой способ, который работает.

Есть ли такие инструменты в LOVE2d / Lua?


person Grolandman    schedule 21.05.2020    source источник


Ответы (1)


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

extern float threshold;    //external variable from our lua script

vec4 effect(vec4 color, Image tex, vec2 texture_coords, vec2 screen_coords)
{
    vec4 texturecolor = Texel(tex, texture_coords); //default shader code

    //get average color of pixel
    float average = (texturecolor[0] + texturecolor[1] + texturecolor[2])/3;
    //set alpha of pixel to 0 if average of RGB is below threshold
    if (average < threshold) {
        texturecolor[3] = 0;
    }

    return texturecolor * color;    //default shader code
}

Этот код вычисляет среднее значение RGB для каждого пикселя, и если среднее значение ниже порога, он изменяет альфа этого пикселя на 0, чтобы сделать его невидимым.

Чтобы использовать эффект пикселей в вашем коде, вам нужно сделать что-то вроде этого (только один раз, возможно, в love.load):

shader = love.graphics.newShader([==[ ... shader code above ... ]==])

и при рисовании изображения:

love.graphics.setShader(shader)
love.graphics.draw(img)
love.graphics.setShader()

Чтобы настроить порог:

shader:send("threshold", number)    --0 to 1 float

Результат:

результат операции рисования

Использованная литература:

person IsawU    schedule 22.05.2020