Как мне рендерить текстуру GL_ALPHA? - PullRequest
4 голосов
/ 16 декабря 2011

Я пытаюсь работать с библиотекой шрифтов FTGL, чтобы создать текстурный шрифт и отобразить его на экране. Библиотека создает текстуру в формате GL_ALPHA для хранения глифов шрифтов, а затем, когда вы указываете ей отображать строку, она проходит и glBegin(GL_QUADS) и отображает каждый глиф именно так, как вы ожидаете.

Единственная проблема в том, что я не получаю никакого текста. В одном сценарии я получаю сплошные черные квадраты вместо текста, в другом я ничего не получаю. Я запустил код в gDEBugger, чтобы убедиться, что текстура загружается и настраивается правильно, и все выглядит правильно, но я все еще не вижу никакого вывода.

Я пробовал очевидные вещи. Вызов glColor заранее, чтобы попытаться установить цвет текста, ничего не делает. Так же как и попытка гарантировать, что альфа-смешивание будет работать правильно, например:

glEnable(GL_ALPHA_TEST);
glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);

Кто-нибудь знает, что мне не хватает, чтобы сделать так, чтобы рендеринг с GL_ALPHA текстуры на экран отображался правильно?

1 Ответ

3 голосов
/ 16 декабря 2011

После изучения кода FTGL становится ясно, что API предназначен для самой визуализации текста. Вы должны вызывать его функции рендеринга, которые будут делать вызовы OpenGL внутри.

Другими словами, FTGL не предназначен для загрузки шрифта в текстуру, а затем дает вам этот текстурный объект, и вы сами рисуете глифы. Это не значит, что вы не можете , поскольку API не поможет вам в этом.

Причина, по которой вы получаете черный цвет, заключается в том, что GL_ALPHA текстуры возвращают нули для компонента RGB при доступе. Поскольку вы используете GL_MODULATE в своей текстурной среде, это умножит ноль на RGB-часть цвета.

Чтобы сделать то, что вы собираетесь, вам нужно установить GL_TEXTURE_ENV_MODE на GL_COMBINE вместо GL_MODULATE. Это означает, что вам нужно использовать режим комбинированной среды , который не прост. Отказавшись от фиксированной функции для шейдеров почти сразу же, как они существовали, я давно не трогал комбайнеры. Так что возьмите то, что следует с зерном соли. Вот пример того, как должен выглядеть код среды:

glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_COMBINE);

glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_RGB, GL_REPLACE);
glTexEnvi(GL_TEXTURE_ENV, GL_SRC0_RGB, GL_PRIMARY_COLOR);
glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND0_RGB, GL_SRC_COLOR);

glTexEnvi(GL_TEXTURE_ENV, GL_COMBINE_ALPHA, GL_REPLACE);
glTexEnvi(GL_TEXTURE_ENV, GL_SRC0_ALPHA, GL_TEXTURE);
glTexEnvi(GL_TEXTURE_ENV, GL_OPERAND0_ALPHA, GL_SRC_ALPHA);

То, что вы хотите сделать, это сгенерировать цвет, в котором RGB-часть берется из glColor, а альфа-часть - из текстуры. Вот как ты это делаешь.

В английском языке в первой строке написано, что режим текстурной среды является «комбинированным», что активирует более сложный режим работы. Следующие три строки определяют, как генерируется RGB-часть цвета. Значение GL_COMBINE_RGB, установленное на GL_REPLACE, означает, что исходное значение RGB 0 будет тем же, что и выходной RGB. Установка GL_SRC0_RGB в GL_PRIMARY_COLOR означает, что исходное значение 0 RGB является основным цветом, который является цветом, генерируемым при обработке вершин (т. Е. Если вы не используете освещение, это то, что вы передали с glColor). Установка GL_OPERAND0_RGB на GL_SRC_COLOR означает, что цвет будет таким, какой он есть (есть специальные операции, которые вы можете выполнить, например, взять 1 - the color или что-то еще).

Следующие 3 строки задают, откуда берется альфа-часть выходного цвета. Значение GL_COMBINE_ALPHA, установленное на GL_REPLACE, означает, что исходное альфа значение 0 (отличное от исходного RGB значение 0) будет тем, чем является выходной альфа. Установка GL_SRC0_ALPHA в GL_TEXTURE означает, что альфа-значение источника 0 исходит из текстуры текущего текстурного блока. Установка GL_OPERAND0_ALPHA в GL_SRC_ALPHA означает, что альфа принимается такой, какой она есть (как и раньше, вы можете применить здесь некоторое преобразование к альфе).

В качестве альтернативы, если ваша реализация OpenGL имеет ARB_texture_swizzle , вы можете настроить маску swizzle для эффективного преобразования формата GL_ALPHA в GL_INTENSITY. Тогда вы можете использовать GL_MODULATE в качестве GL_TEXTURE_ENV_MODE. Тем не менее, вы должны убедиться, что ваш режим смешивания glBlendMode(GL_ONE, GL_ONE_MINUS_SRC_ALPHA). Это необходимо, потому что GL_MODULATE умножит цвет на альфа. Если бы вы использовали GL_SRC_ALPHA вместо GL_ONE, вы бы делали умножение на альфа дважды (один раз на этапе env текстуры, один раз на этапе наложения).

...