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


10

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


Поддерживает ли 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
Похоже, вы знаете свое альфа-смешение!
Бобобобо
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.