Как переопределить цвет текстуры в opengl?

Я работаю над движком (http://b2dengine.com/), чтобы реализовать свою игровую идею, которая уже находится в процессе. Теперь довольно долго я застрял с этой проблемой с рендерингом текста.

У меня есть атлас текстур, который содержит все поддерживаемые/необходимые символы в одном изображении png. Отображение символов определяется классом Font. Все работает отлично, персонажи прорисовываются правильно и точно. Дело в том, что мне также нужна возможность изменить цвет текста. Это звучит, и я уверен, что это просто, но я не могу заставить его работать.

Я использую эту функцию смешивания gl для получения желаемого эффекта.

GL.instance.glBlendFunc(GL.instance.GL_SRC_ALPHA, GL.instance.GL_ONE_MINUS_SRC_ALPHA);

В большинстве случаев это работает, если цвет несколько темный. Но когда он установлен на белый, я вижу артефакты. Скриншот могу предоставить, если нужно. Также, чтобы это работало, «текст» в текстуре должен быть белым.

Я использую opengl 1.1 (да, я знаю, что он старый, но я просто не готов к шейдерам).

Итак, вкратце, мой вопрос: как отрендерить текстуру и полностью заменить цвет? Сохранение только альфа-канала. Например. если он черный и прозрачный на 80% в png, при рендеринге я хочу, чтобы он был зеленым с прозрачностью 80% на экране.


person FDIM    schedule 09.09.2012    source источник


Ответы (1)


Я думаю, что это сработает, хотя это давно устаревшие функции, и я мало что о них помню.

При активном блоке текстур с текстовой текстурой попробуйте установить следующие параметры:

glTexEnv(GL_TEXTURE_ENV, GL_COMBINE_RGB, GL_REPLACE);
glTexEnv(GL_TEXTURE_ENV, GL_COMBINE_ALPHA, GL_REPLACE);
glTexEnv(GL_TEXTURE_ENV, GL_SRC0_RGB, GL_PRIMARY_COLOR);
glTexEnv(GL_TEXTURE_ENV, GL_SRC0_ALPHA, GL_TEXTURE);

Я считаю, что это заменит RGB вашего фрагмента цветом входящего фрагмента (glColor) и полностью проигнорирует канал RGB текстуры. Сказав это, было бы намного лучше, если бы вы для начала просто загрузили текстуру альфа-канала.

Обязательно проверьте наличие ошибок, и если это не сработает, вы можете увидеть, не взял ли я что-то неправильно отсюда: http://www.opengl.org/sdk/docs/man/xhtml/glTexEnv.xml

person Tim    schedule 09.09.2012
comment
Я не знаю, какую версию GL использует автор этого поста, но glTexEnv уже устарел. Прочтите это:opengl.org/wiki/Common_Mistakes:_Deprecated#glTexEnvi. И особенно обратите внимание на эту строку: Также имейте в виду, что glTexEnvi не действует, когда привязан фрагментный шейдер. - person Michael IV; 10.09.2012
comment
@MichaelIV, я согласен, что это устарело, но OP ясно говорит, что он использует очень старый opengl (1.1) - person Tim; 10.09.2012
comment
Ах да, не вижу. Жалко его ;) - person Michael IV; 10.09.2012
comment
Это не сработало, но спасибо за идею с альфа-изображением. Я новичок в opengl, поэтому взял старую версию. Поскольку это кажется намного более простым в освоении, сначала я хочу получить хорошее представление о том, как все работает. С той работой, которую я проделал до сих пор, часть opengl относительно невелика. Так что портировать его на OpenGL SE 2 будет не так уж и сложно :) - person FDIM; 10.09.2012
comment
Я новичок в opengl, поэтому взял старую версию. Уверен, вы уже слышали это раньше, но поверьте мне, это довольно плохая идея. Шейдеры намного более интуитивно понятны, чем эти дурацкие старые функции объединения текстур, то, что вы хотите сделать, может быть легко достигнуто в одной простой для понимания строке одного шейдера. Поверьте мне, вам будет гораздо лучше просто прыгнуть в современный OpenGL обеими ногами, чем изучать эти старые методы. Помните, что они устарели по какой-то причине. @FDIM - person Tim; 10.09.2012
comment
Спасибо за предложение, я думаю, что сделаю это, когда выпущу игру. Потому что сейчас на моем пути в основном стоит только эта мелочь с текстом. Если бы я занимался рефакторингом, я бы отложил разработку игры, которая и так уже отложена более чем достаточно. - person FDIM; 10.09.2012
comment
@FDIM, понял, извините, что мое решение не сработало. Я уверен, что то, что вы ищете, можно найти на той странице glTexEnv, на которую я дал ссылку, хотя это довольно сложная документация, поэтому вам, возможно, придется некоторое время поэкспериментировать с ней. - person Tim; 11.09.2012