OpenGL - Текстуры - Замена черного (белого) цветом - PullRequest
1 голос
/ 23 апреля 2011

Я создаю растровое изображение для отображения текста с помощью OpenGL, используя Cairo / Pango. Я создаю растровое изображение в виде RGBA с прозрачным фоном и текстом черного или белого цвета. (Предположим, черный.)

Если я загружаю это растровое изображение как текстуру OpenGL и отображаю его, он отображается как черный текст или белый текст, как и ожидалось.

Я бы хотел иметь возможность раскрасить текст, используя только оригинальную текстуру, но с OpenGL, заботящимся о раскраске.

Предпочтительно, я бы хотел использовать glColor для установки цвета, но я готов использовать glBlendColor или GL_TEXTURE_ENV_COLOR.

Однако я не могу заставить работать эти опции.

Я пробовал то, что кажется бесчисленным количеством комбинаций - белый текст или черный текст - включить смешивание или использовать GL_TEXTURE_ENV_MODE's GL_BLEND - попробовать GL_MODULATE, GL_REPLACE и GL_COMBINE - пробовать различные комбинации glBlendFunc

Я искал в Интернете и читал спецификацию в течение нескольких часов, и я действительно на грани веревки.

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

Ответы [ 3 ]

3 голосов
/ 23 апреля 2011

Самый простой способ - создать текстовое растровое изображение с белым текстом и прозрачным фоном.

Затем, чтобы раскрасить его, вы должны убедиться, что для TEXTURE_ENV_MODE установлено значение MODULATE:

glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);

При этом цвет рисования будет glColor * textureColor == glColor (так как textureColor - белый)

Затем вы должны включить смешивание для обработки прозрачного фона:

glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);

или , если ваши растровые изображения имеют предварительно умноженную альфа-форму:

glEnable(GL_BLEND);
glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA);
1 голос
/ 23 апреля 2011

Вместо предоставления полного набора RGBA, позвольте тексту просто определить не / прозрачность, то есть просто предоставить альфа-канал.Затем используйте обычный glColor, чтобы установить цвет текста.

0 голосов
/ 23 апреля 2011

Звучит так, как будто вы можете создать растровое изображение так, как считаете нужным. Если это так, то вместо черного на белом я бы нарисовал текст в альфа-канал. Затем, чтобы раскрасить текст, вы рисуете прямоугольник (или любой другой) нужного вам цвета. Затем нарисуйте свою текстуру поверх него. Там, где текстура непрозрачна, вы получите цвет текстуры. Там, где текстура прозрачна, цвет фона будет просвечивать.

Для этого вам нужно настроить glBlendFunc. Обычное должно быть хорошо:

glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);

Вы также должны включить смешивание для текстурирования:

glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_BLEND);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...