OpenGL ES - изменение оттенка цветов в текстуре

Разрабатываю простую 2D-игру на OpenGL ES для iPhone. Моя проблема в том, что я хочу визуализировать текстуру, используя разные оттенки. В основном я хочу изменить оттенок цветов текстуры, которую я визуализирую. Простое изменение glColor не работает, поскольку оно также влияет на части изображения без цвета. Любые идеи?


person Jens Utbult    schedule 13.10.2009    source источник
comment
можете пояснить, почему вы думаете, что glColor не будет работать? Что вы имеете в виду, это также влияет на части изображения без цвета   -  person Bahbar    schedule 13.10.2009
comment
Я предполагаю, что есть белая часть текстуры, которая должна оставаться белой, но есть красная часть текстуры, которая вместо этого должна быть зеленой. В этом случае - как насчет двух отдельных прозрачных текстур, одна с той частью, которая не должна изменяться, и одна, которую вы можете визуализировать с разными настройками glColor?   -  person David Maymudes    schedule 14.10.2009
comment
Дэвид прав. Черная и серая части также должны остаться черными и серыми. Текстуры, которые я использую, предварительно визуализируются в 3D-программе с градиентами, например, от синего до белого, что затрудняет их разделение на две текстуры.   -  person Jens Utbult    schedule 14.10.2009


Ответы (1)


Спасибо за разъяснение, это было далеко от моего первоначального понимания. Обратите внимание, что текстура, которую вы предоставляете OpenGL ES, уже имеет оттенок, поэтому вы просите изменить существующий оттенок.

Во-первых, позвольте мне ответить на поставленный вопрос:

Начнем с того, что должно произойти с текселями. Поскольку текстуры OpenGL хранятся как RGB, чтобы преобразовать оттенок текселя, вам нужно выбрать RGB-> HSL-> применить новый оттенок-> RGB. Вы можете найти математические вычисления для преобразования RGB-> HSL и обратного преобразования здесь. Как вы хотите выбрать новый оттенок, я полагаю, вам придется это заполнить.

Самый большой вопрос - когда должно произойти преобразование. Что ж, конвейер OpenGL не позволит вам выполнить такое сложное преобразование при чтении текстуры (в любом случае, не в ES 1.1 - ES 2.0 fragment shaders поможет, но за высокую цену). Таким образом, вам придется выполнять все преобразования за пределами конвейера текстурирования GL ES. В зависимости от того, как часто вам нужно менять оттенки, я советую либо делать это в автономном режиме (и хранить различные тематические текстуры), либо вычислять новые текстуры для новых оттенков по запросу непосредственно перед их загрузкой в ​​OpenGL ES.

Насколько мне известно, GL ES 1.1 не имеет встроенных средств, которые помогли бы сделать это напрямую.

Теперь, сделав шаг назад, я не уверен, что мешает вам разделиться на 2 текстуры, если вы можете жить с 2 текстурами для применения во время выполнения. Математика, на которую я указал, отделяет насыщенность от яркости независимо от того, как была сгенерирована текстура (и теоретически оттенок должен быть постоянным, если я правильно понимаю ваш случай). Выполнение вычислений в автономном режиме должно быть довольно простым для любой входной текстуры?

person Bahbar    schedule 18.10.2009