Как я могу имитировать смешивание "Glow Dodge" с помощью OpenGL Shader? - PullRequest
1 голос
/ 15 апреля 2020

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

final.rgb = dest.rgb / (1 - source.rgb) 

Затем я нашел 2 способа сделать это, но ни один из них, похоже, не работа.

Сначала нужно было вычислить 1 / (1 - source.rgb) в шейдере и умножить смешивание, используя glBlendfunc(GL_ZERO, GL_SRC_COLOR) или glBlendfunc(GL_DST_COLOR, GL_ZERO).

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

Второй - перенести фоновые тексели используя glReadPixel(), затем вычислите все в шейдере, затем выполните аддитивное смешивание, используя glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA).

независимо от того, какой результат я могу получить, glReadPixel() само по себе занимает слишком много времени даже с 30 x 30 текселями площадь. поэтому я не могу использовать этот метод.

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

1 Ответ

0 голосов
/ 15 апреля 2020

С расширением EXT_shader_framebuffer_fetch значение из кадрового буфера может быть прочитано:

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

Расширение доступно для dektop OpenGL и OpenGL ES. Расширение OpenGL должно быть включено (см. Базовый язык (GLSL) - Расширения . Цвет фрагмента можно получить с помощью встроенной переменной gl_LastFragData. Например:

#version 400
#extension GL_EXT_shader_framebuffer_fetch : require

out vec4 fragColor;

# [...]

void main 
{
    # [...]

    fragColor = vec4(gl_LastFragData[0].rgb / (1.0 - source.rgb), 1.0);  
}
...