Режим смешивания цветов Opengl ES

У меня есть система частиц, визуализируемая поверх фоновой текстуры. Каждая частица является квадратом и к ней не применяется текстура, и все они одного цвета. Фон представляет собой текстуру в оттенках серого. Я пытаюсь добиться того же типа смешивания, известного в таких приложениях, как Gimp, что и режим смешивания цветов.

В основном, область фона, покрытая частицей, должна сохранять свою яркость, но принимать цвет частицы. Я пробовал несколько комбинаций параметров glBlendFunc() и пытался возиться с glTexEnv, но у меня много проблем с его пониманием. В настоящее время, если две частицы перекрываются, они становятся ярче или темнее (в зависимости от параметров glBlendFunc).

Я использую OpenGL ES 1.1 на Android. Есть ли способ достичь этого эффекта без использования OpenGL ES 2.0? Если так, то, что это?

1 ответ

glBlendFunc поддерживает только отдельные режимы наложения. Смешивание только с оттенком неразделимо, поэтому его нельзя выразить в стандартном OpenGL. Смотрите эту презентацию Марка Килгарда от Nvidia, слайд 41.

Nvidia предоставляет расширение для своих новых графических процессоров (включая Tegra), которое называется NV_blend_equation_advanced, которое добавляет GL_HSL_HUE_NV а также GL_HSL_COLOR_NV токены для выполнения описываемой вами операции. Учитывая, что вы хотите поддерживать OpenGL ES 1.1, на самом деле это не вариант для вас.

Тем не менее, может быть способ достичь эффекта, который вы описываете, учитывая, что ваш фон имеет оттенки серого:

  1. преобразовать цвет частиц из RGB в цветовое пространство HSL
  2. максимизировать яркость в HSL (т.е. установить его на 1,0 0,5)
  3. преобразовать обратно в RGB. Это будет ваш фактический цвет частиц
  4. нарисуйте свою частицу с помощью операции умножения: glBlendFunc(GL_DST_COLOR, GL_ZERO)

Это должно поддерживать яркость при окрашивании фона цветом частицы.

Редактировать: glBlendFunc(GL_DST_COLOR, GL_SRC_COLOR) даст 2 * исходный * целевой цвет, который может помочь.

Изменить 2: попробуйте glTexEnvf следующим образом

  1. Сделать фон с glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_REPLACE)
  2. Рендеринг частиц с использованием glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE)

Прошло уже более десяти лет с тех пор, как я в последний раз использовал glTexEnv, но может быть комбинация параметров, которые могут достичь того, что вы пытаетесь сделать.

Другие вопросы по тегам