2012-05-31 1 views
1

Я пишу простой просмотрщик изображений для отображения изображений на пару треугольников в OpenGL ES 2.0 на Android. В этих изображениях есть определенный цвет, который каким-то образом должен быть заменен черным. Проблема заключается в том, что если GL_LINEAR используется для моих фильтров min и maxifying, контур цвета, который необходимо заменить, остается видимым. Если я использую GL_NEAREST для своих фильтров, шейдер может заменить цвет без особых трудностей, однако он не делает изображения плавно и, конечно же, выглядит неравномерным при масштабировании и выходе.Как заменить цвет в текстуре из моего шейдерного кода?

Интересно, есть ли лучший способ выполнить этот тип задачи. Некоторые идеи у меня были:

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

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

Я совершенно новый для OpenGL ES 2.0, но я стараюсь узнать, как все работает. Пожалуйста, имейте это в виду и помогите мне учиться. Заранее спасибо.

+0

Вы используете альфа-канал и редактируете исходные изображения? Возможно, было бы более целесообразно делать это с альфа-каналом, чем с цветовой клавиатурой. В противном случае я не могу придумать лучшего способа, я думаю, что вы достаточно четко обозначили ограничения. – Tim

+0

Редактирование исходных изображений занимает много времени в Дальвике, и я бы предпочел не иметь этих накладных расходов. В настоящее время код ничего не делает с альфа-каналом, но изображения, которые мы показываем, на самом деле представляют собой 16-битные оттенки серого, которые я кодирую как RGB_565 и декодирую бит в шейдере. Это немного уродливо, но, похоже, работает. Лучшие результаты, которые мы, по-видимому, предварительно обработали нашими изображениями на сервере, а также не пытались сделать цветную настройку на клиенте вообще. Возможно, нам придется прибегнуть к этому решению. – Thorinside

+0

Я также могу добавить, что пиксели маски не перемещаются в изображениях. Они все в одном месте. Полагаю, я мог бы также попробовать создать альфа-текстуру и использовать ее для установки альфы выходных пикселей? Или я также увижу эту проблему в этом случае? – Thorinside

ответ

1

В этом случае (маска всегда в том же месте), я думаю, у вас есть больше возможностей.

Я хотел бы создать единый образ канала с маской областями, как 1 и немаскированные области с 0.

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

Это несколько облегчает проблему с использованием GL_LINEAR, поскольку вы можете настроить значение, при котором вы отклоняете пиксель.

Например, если вы выбираете между маскированным и незамасленным пикселями, то значение маски будет равно 0,5, а цвет будет (0,5 * color_key + 0,5 * unmasked_color). Если вы обнаружите это неприемлемое цветовое кровотечение, вы можете установить альфа-отклонение на 0,1, 0,001 и т. Д., Чтобы замаскировать любой пиксель с небольшим следом маски. Это немного увеличит область маскировки, но позволит вам не видеть след цветового ключа в любом месте результата.

+0

Также убедитесь, что маска и текстура имеют одинаковую разрешающую способность, или это может не сработать. – Tim

+0

Я понимаю, о чем вы говорите.Сегодня я провел эксперимент, чтобы узнать о том, что происходит с выборкой, и что вы говорите о линейной интерполяции, возвращаемой 0.5, когда образец отбирается. Это, вероятно, сработает. Я попытаюсь посмотреть, смогу ли я реализовать что-то подобное. Благодарю. – Thorinside

+0

Я только что сделал тестовую реализацию этого, добавив текстуру маски и используя ее в шейдере, как вы предложили. Он отлично работает. Еще раз спасибо @Tim. – Thorinside

Смежные вопросы