После изучения кода 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 текстуры, один раз на этапе наложения).