Как инвертировать цвет фона пикселя

10

Я пишу игру и редактор карт, используя Java и jMonkeyEngine. В редакторе карт, я сделал кисть с помощью каркасной сферы. Моя проблема: я хочу сделать его видимым везде, поэтому я хочу инвертировать цвет пикселя «позади» этой кисти. Я хотел сделать это с фрагментным шейдером (GLSL), но я не знаю, как получить цвет этого пикселя.

m4tx
источник
Поддерживает ли jMonkeyEngine постпроцессные эффекты? Вам, вероятно, придется пойти по этому пути.
Сэм Хоцевар
Да, jMonkeyEngine поддерживает пост-процессные эффекты, но я не слишком знаком с ними в данный момент. Спасибо за предложение.
m4tx
Мммм, неважно, есть более простые способы. Я постараюсь ответить правильно.
Сэм Хоцевар
Вы можете использовать glLogicOp (GL_XOR)? opengl.org/sdk/docs/man/xhtml/glLogicOp.xml
Адам
1
Обратите внимание, что инверсия не гарантирует вам видимости в целом ряде угловых случаев, например, ненасыщенных серых, и обеспечивает плохую видимость для многих других случаев.
Ларс Виклунд

Ответы:

16

Быстрый и простой способ сделать это - использовать стандартное уравнение смешивания со следующими параметрами:

glEnable(GL_BLEND);
glBlendFunc(GL_ONE_MINUS_DST_COLOR, GL_ZERO);

Если srcэто исходный цвет (тот из вашего нового объекта) и dstцвет назначения (тот, который находится в кадровом буфере), он вычислит новый цвет следующим образом:

new = src * (1 - dst) + dst * 0
    = src * (1 - dst)

Так что вам просто нужно установить src = 1, т.е. белый, и вы получите обратное видео. Фрагмент шейдера GLSL будет:

void main(void) {
    gl_FragColor = vec4(1.0, 1.0, 1.0, 1.0);
}
Сэм Хоцевар
источник
4
Похоже, вы знаете свое альфа-смешение!
Бобобобо