Режим наложения Photoshop для OpenGL ES без шейдеров - PullRequest
16 голосов
/ 04 мая 2009

Мне нужно имитировать режимы наложения Photoshop («умножение», «экран» и т. Д.) В моем коде OpenGL ES 1.1 ( без шейдеров).

Есть несколько документов о том, как это сделать с HLSL:

Мне нужен хотя бы рабочий режим экрана.

Есть ли какие-нибудь реализации на фиксированном конвейере, на которые я могу посмотреть?

Ответы [ 4 ]

15 голосов
/ 04 мая 2009

Большинство режимов наложения фотошопа основаны на режимах наложения Портера-Даффа.

Для этого необходимо, чтобы все ваши изображения (текстуры, рендер-буфер) находились в предварительно умноженном цветовом пространстве. Обычно это делается путем умножения всех значений пикселей на альфа-значение перед сохранением их в текстуре. Например. полный прозрачный пиксель будет выглядеть как черный в неумноженном цветовом пространстве. Если вы не знакомы с этим цветовым пространством, потратьте час или два, читая об этом в Интернете. Это аккуратная и хорошая концепция, которая требуется для композиций, подобных фотошопу.

В любом случае - если у вас есть изображения в этом формате, вы можете включить ЭКРАН, используя:

glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_COLOR)

Полный режим MULTIPLY невозможен с конвейером OpenGL | ES. Если вы работаете только с полностью непрозрачными пикселями, вы можете подделать его, используя:

glBlendFunc(GL_ZERO, GL_SRC_COLOR)

Результаты для прозрачных пикселей в вашей текстуре и фреймбуфере будут неверными.

10 голосов
/ 01 апреля 2010

вы должны попробовать это:

glBlendFunc(GL_DST_COLOR, GL_ONE_MINUS_SRC_ALPHA)

Это похоже на умножение на iPhone / OpenGL ES

1 голос
/ 24 марта 2011

Я обнаружил, что с помощью этого:

glDepthFun( GL_LEQUAL);

было все, что нужно, чтобы получить эффект экрана, по крайней мере, он работал хорошо в моем проекте.

Я не уверен, почему это работает, но если кто-то знает, пожалуйста, поделитесь.

1 голос
/ 04 мая 2009

Лучшее место для начала - взять копию Красной книги и прочитать главы о материалах и режимах смешивания. Он содержит очень полное и четкое объяснение того, как работают «классические» функции смешивания OpenGL.

...