Так что я играю с созданием простого игрового движка на С ++. Мне нужно было сделать текст, поэтому я использовал этот урок (http://learnopengl.com/#!In-Practice/Text-Rendering) для руководства. Он использует библиотеку freetype 2.
Все отлично работает, текст рендерит как надо. Но теперь, когда я расширяю пользовательский интерфейс и создаю ярлыки, я хотел бы иметь возможность изменять размер текста. Я могу сделать это путем масштабирования текста, но я бы хотел сделать это с помощью пикселей.
Здесь вы можете увидеть масштабирование в действии:
GLfloat xpos = x + ch.Bearing.x * scale;
GLfloat ypos = y + linegap + (font.Characters['H'].Bearing.y - ch.Bearing.y) * scale;
GLfloat w = ch.Size.x * scale;
GLfloat h = ch.Size.y * scale;
Поэтому в моем методе renderText я просто передаю переменную масштаба, и она масштабирует текст. Но я бы предпочел использовать пиксели, так как это более удобно для пользователя, есть ли способ, которым я мог бы сделать это в freetype 2, или я застрял с переменной масштаба?
Предполагая, что вы не хотите регенерировать глифы с другим разрешением, а вместо этого хотите указать масштаб в виде единицы пикселей вместо отношения (т.е. вы хотите сказать, scale = 14 pixels
вместо scale = 29%
), то вы можете сделать следующее: Сохранить значение высоты, которое вы передали FT_Set_Pixel_Sizes
(что в учебнике 48). Теперь, если вы хотите сделать рендеринг с 14 пикселями, просто разделите 14 на это число (48), чтобы получилось scale = 14.0f / 48.0f
, Это даст вам масштаб, необходимый для рендеринга в масштабе 14 пикселей от шрифта, который был изначально создан с высотой 48 пикселей.
Возможно, вы захотите поиграть с вашими фильтрами текстур OpenGL или mipmapping, когда вы делаете это, чтобы улучшить свои результаты. Кроме того, шрифты иногда имеют пиксельные подсказки с низким разрешением, что помогает им четко отображаться даже при низких разрешениях; к сожалению, эта информация хинтинга теряется / не используется, когда вы генерируете текстуру с высоким разрешением, а затем уменьшаете ее до меньшего размера рендера, поэтому она может выглядеть не так ясно, как вы хотите.
Других решений пока нет …