Я пишу текстовый модуль для двигателя OpenGL, используя NVidia Path extension (путь NV). Расширение позволяет загружать систему и внешние файлы шрифтов с помощью trutype metrics. Теперь мне нужно установить стандартный размер шрифта (в пикселях) для глифов при рендеринге текста. По умолчанию загружается глиф имеет EMscale = 2048. При поиске глифа метрика-к-пикселов преобразования я нашел это:Преобразование шрифта TrueType по умолчанию в пиксель в NV Path
Преобразование FUnits в пиксели
Значения в эм площади преобразуется в значение в пикселе система координат, умножая их на шкалу. Эта шкала: pointSize * Разрешение/(72 точек на дюйм * units_per_em)
Так units_per_em равен 2048, pointSize и разрешение неизвестного я не могу resolve.How я получаю значение разрешения для окна просмотра ширину и высоту, чтобы войти в это уравнение? Кроме того, каков должен быть размер точки, если мой вход - размер пикселя для шрифта?
Я попытался решить это уравнение с помощью другого типа ввода, но мой визуализированный текст всегда меньше (или больше), чем ссылочный текст (AfterEffects).
Документы NV_Path относятся к FreeType2 metrics. Ссылка говорит:
Метрик найдены в лицевой стороне> glyph-> метрике, как правило, выражаются в формате 26,6 пикселей (т.е. 1/64th пикселей), если вы не используете флаг FT_LOAD_NO_SCALE при вызове FT_Load_Glyph или FT_Load_Char , В этот случай метрики будут выражены в исходных единицах шрифта.
Я попытался уменьшить масштаб текстовой матрицы на 1/64. Он приближается к правильному размеру, но все еще не идеален.
Вот как я в настоящее время установки в визуализации текста в коде:
emScale=2048;
glyphBase = glGenPathsNV(1+numChars);
pathTemplate= ~0;
glPathGlyphRangeNV(glyphBase,GL_SYSTEM_FONT_NAME_NV,
"Verdana",GL_BOLD_BIT_NV,0,numChars,GL_SKIP_MISSING_GLYPH_NV,pathTemplate,emScale);
/* Query font and glyph metrics. */
glGetPathMetricRangeNV(
GL_FONT_Y_MIN_BOUNDS_BIT_NV|
GL_FONT_Y_MAX_BOUNDS_BIT_NV|
GL_FONT_X_MIN_BOUNDS_BIT_NV|
GL_FONT_X_MAX_BOUNDS_BIT_NV|
GL_FONT_UNDERLINE_POSITION_BIT_NV|
GL_FONT_UNDERLINE_THICKNESS_BIT_NV,glyphBase+' ' ,1 ,6*sizeof(GLfloat),font_data);
glGetPathMetricRangeNV(GL_GLYPH_HORIZONTAL_BEARING_ADVANCE_BIT_NV,
glyphBase,numChars,0,horizontalAdvance);
/* Query spacing information for example's message. */
messageLen = strlen(message);
xtranslate =(GLfloat*)malloc(sizeof(GLfloat) *messageLen);
if(!xtranslate){
fprintf(stderr, "%s: malloc of xtranslate failed\n", "Text3D error");
exit(1);
}
xtranslate[0] = 0.0f; /* Initial xtranslate is zero. */
/* Use 100% spacing; use 0.9 for both for 90% spacing. */
GLfloat advanceScale = 1.0f,
kerningScale = 1.0f;
glGetPathSpacingNV(GL_ACCUM_ADJACENT_PAIRS_NV,
(GLsizei)messageLen,GL_UNSIGNED_BYTE,message,glyphBase,
advanceScale,kerningScale,GL_TRANSLATE_X_NV,&xtranslate[1]); /* messageLen-1 accumulated translates are written here. */
const unsigned char *message_ub = (const unsigned char*)message;
totalAdvance = xtranslate[messageLen-1] +
horizontalAdvance[message_ub[messageLen-1]];
xBorder = totalAdvance/messageLen;
glEnable(GL_STENCIL_TEST);
glStencilFunc(GL_NOTEQUAL ,0 ,~0);
glStencilOp(GL_KEEP,GL_KEEP,GL_ZERO);
////////// init matrices /////////////
translate(model ,vec3(0));
translate(view ,vec3(0));
float nearF=1 ,farF = 1200;
glViewport(0,0,_viewPortW,_viewPortH);
glMatrixLoadIdentityEXT(GL_PROJECTION);
float aspect_ratio =(float) _viewPortW /(float) _viewPortH;
glMatrixFrustumEXT(GL_PROJECTION ,-aspect_ratio,aspect_ratio,-1 ,1 ,nearF,farF);
model=translate(model,vec3(0.0f,384.0,0.0f));//move up
//scale by 26.6 also doesn't work:
model=scale(model,vec3((1.0f/26.6f),1.0f/26.6f,1.0f/26.6f));
view=lookAt(vec3(0,0,0),vec3(0,0,-1),vec3(0,1,0));
}