Як інвертувати колір фонового пікселя


10

Я пишу редактор ігор та карт за допомогою Java та jMonkeyEngine. У редакторі карт у мене є пензлик, зроблений за допомогою каркасної сфери. Моя проблема полягає в тому, що я хочу зробити його видимим скрізь, тому хочу перевернути колір пікселя "позаду" цієї кисті. Я хотів це зробити з фрагментом шейдера (GLSL), але не знаю, як отримати колір цього пікселя.


Чи підтримує jMonkeyEngine ефекти після обробки? Ймовірно, вам доведеться йти цим шляхом.
— sam hocevar

Так, jMonkeyEngine підтримує ефекти після обробки, але я зараз не надто знайомий з ними. Дякуємо за пропозицію.
— m4tx

Мммм, ніколи не буває, є більш прості способи. Я спробую відповісти належним чином.
— sam hocevar

Чи можете ви використовувати 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.