2013-04-03 4 views
0

Я использую функцию смешивания раскрасить глифы, полученные из библиотеки Freetype при использовании субпиксельного рендеринга (LCD, формат глиф растрового изображения RGB (не альфа)):Изменение glBlendColor изнутри вершина/фрагмент шейдер

Я загрузить текстуру в формате RGB в GPU и используются следующее смешивание:

glBlendFunc(GL_CONSTANT_COLOR_EXT, GL_ONE_MINUS_SRC_COLOR); 
glBlendColor(r, g, b, 1); 

R, G, B представляет собой желаемый цвет глифа. Это отлично работает, пока глифы имеют одинаковый цвет (я использую единственный буфер вершин). Я бы хотел, чтобы у каждого символа был другой цвет, и тогда мне нужно будет указать другой цвет смешивания из шейдера, но я думаю, что это невозможно. Кто-нибудь знает, как это можно сделать (если это вообще возможно)?

Соответствующий проект available here

Я думал, что в какой-то момент я нашел «правильный» шейдер, но это не так на самом деле (см issue 48)

ответ

0

Вы не можете. И на самом деле нет причин. Просто используйте цвет для вершин, а затем умножьте значения, которые вы получаете от своей текстуры, по этому цвету на вершине.

Однако, если вы действительно хотите сделать это таким образом, вы можете write a second color from the fragment shader, если у вас есть GL 3.3:

layout(location = 0, index = 0) out vec4 textureColor; 
layout(location = 0, index = 1) out vec4 glyphColor; 

Вы можете затем use that in your blending equation:

glBlendFunc(GL_SRC1_COLOR, GL_ONE_MINUS_SRC_COLOR); 

Но на самом деле, это бесполезно в вашем случае. Просто используйте шейдер фрагмента, чтобы размножить их вместе.

+0

Простое увеличение цвета текстуры с помощью цвета в виде вершин приведет к потере информации, нет (с поддержкой субпикселя, сглаживание выполняется с использованием полных RGB-пикселей)? Если, например, я хочу нарисовать глиф в черном, умножая текстуру глифа черным цветом, получается черным для RGB, и только альфа будет сглаживать глиф, но с использованием только уровней серого. С цветом blend func/blend я могу хранить эту информацию. –

+0

@NicolasRougier: Тогда вам нужно принять решение: хотите ли вы принудительно смешивать два источника (и, следовательно, заставить пользователя иметь оборудование класса GL 3.3+)? Или вы хотите получить * очень незначительную визуальную потерю качества от выполнения первого умножения и смешивания с альфой, как большинство приложений OpenGL отображают текст? В этом случае подэлементное сглаживание не стоит усилий. Особенно, когда вы прекратите использовать [методы, подобные этому] (http://www.valvesoftware.com/publications/2007/SIGGRAPH2007_AlphaTestedMagnification.pdf). –

+0

Спасибо за ответ, но рендеринг/позиционирование субпикселя весьма критично, чтобы иметь безупречный рендеринг при малом и среднем размере шрифта. Это может быть не так важно для игры, но для веб-браузера это критическая проблема. –