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


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.