Режимы наложения Photoshop с OpenGL

Я планирую сделать простой инструмент для рисования, который поддерживает несколько слоев и все режимы наложения из Photoshop.

Я собираюсь сделать смешивание на графическом процессоре (поместить каждый слой в текстуру и нарисовать 2 треугольника для рендеринга каждого слоя). Но я не уверен, можно ли реализовать все режимы наложения с помощью blendFunc OpenGL. /blendEquation и т. д.

Другой вариант - передать все текстуры + флаги режимов наложения в один фрагментный шейдер и смешать их так, как я хочу, но мне придется перекомпилировать FS при добавлении/удалении какого-либо слоя (sampler2D).

Так что ты думаешь? Является ли это возможным? Есть ли лучшие способы использования GPU для смешивания? Так должен ли я заботиться об этом сейчас, или я должен сделать все это на процессоре и позаботиться об улучшениях в будущем?

КСТАТИ. это будет программа на JavaScript с использованием WebGL, но думаю это не имеет значения.


person Ivan Kuckir    schedule 19.09.2012    source источник
comment
если возможно реализовать все режимы наложения с помощью blendFunc / blendEquation и т. д. OpenGL. Невозможно реализовать все режимы наложения. Аппаратное смешивание кадрового буфера несколько ограничено в операциях, которые оно может выполнять.   -  person Tim    schedule 19.09.2012
comment
Спасибо, Тим, я думал, что некоторые режимы наложения невозможны, но я не был уверен. Поэтому я просто реализую на процессоре.   -  person Ivan Kuckir    schedule 19.09.2012
comment
Если это поможет, моя среда с открытым исходным кодом здесь: github.com/BradLarson/GPUImage содержит многие из этих сочетаний режимы как шейдеры OpenGL ES, которые должны быть легко переносимы в WebGL. Я использовал собственную эталонную спецификацию Adobe для расчетов смешивания, поэтому они должны точно соответствовать поведению Photoshop. Просто посмотрите на верхнюю часть различных реализаций blend-классов, чтобы увидеть код шейдера, который я использовал.   -  person Brad Larson    schedule 20.09.2012


Ответы (1)


Конечно вы можете. Но это нужно делать в разделителях.

Загружаем две картинки (на самом деле можно и больше), рендерим треугольники. Но затем просто используйте свои шейдеры, чтобы исследовать обе текстуры и смешать эти значения с уравнением, которое зависит от текущего режима наложения (предоставляется как унифицированный).

PS не забудьте отключить мипмапы и фильтрацию.

person przemo_li    schedule 19.09.2012
comment
Да, я знаю, но есть некоторые вещи, которые мне не нравятся в этом решении. Мне нужно будет иметь разные сэмплеры для каждого слоя. Я должен создать новую программу FS при добавлении слоев. И могут быть проблемы, когда два слоя имеют разные размеры. Вот почему я хотел сделать это с несколькими отрисовками в фреймбуфере. - person Ivan Kuckir; 19.09.2012
comment
В порядке. Поэтому используйте многопроходное решение. Вместо рендеринга в буфер рендеринга рендерите в текстуру. И когда вы сделали это для всех слоев, визуализируйте как обычную текстуру. Таким образом, вам нужна только одна FS, независимо от того, сколько слоев. - person przemo_li; 19.09.2012
comment
Да, но есть одна проблема — я хочу иметь возможность смешивать все эти текстуры, одну с другой, используя все режимы наложения из Photoshop. - person Ivan Kuckir; 19.09.2012
comment
Пример 1: Lay A, Lay B, Lay C. Смешайте A с B в режиме a1, затем смешайте результат с Lay C в режиме a2. Или смешать A, B и C с режимом b2 одновременно? - person przemo_li; 19.09.2012
comment
И: Значит, Blend(A,B,C) — это не то же самое, что Blend(A, Blend(B,C))? Нельзя сначала смешать 2 слоя, а потом использовать результат, а надо делать все за один прогон? - person przemo_li; 19.09.2012
comment
что вы подразумеваете под смесью с режимом? это blendFunc из OpenGL или мой собственный режим в фрагментном шейдере? - person Ivan Kuckir; 19.09.2012
comment
Нет, я имею в виду математические операции, которые будут описывать, что происходит с цветами из разных слоев. - person przemo_li; 19.09.2012
comment
давайте продолжим обсуждение в чате - person przemo_li; 19.09.2012