2013-04-30 2 views
0

Я пишу текстовый модуль для двигателя 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)); 

} 

ответ

0

Разрешение зависит от устройства и с помощью уравнения, приводимого в DPI (точек на дюйм). point_size - размер шрифта, выбираемый пользователем в точках. A Point = 1/72 Inch (на самом деле это размер точки, используемой в PostScript, фактическая единица «Точка», используемая наборщиками, несколько отличается).

Разрешение устройства может быть запрошено с использованием зависимых от ОС методов. Google для «Дисплей DPI $ NAMEOFOPERATINGSYSTEM». Используя размер в точках, вы получаете постоянные физические размеры шрифта независимо от используемого устройства отображения.

Обратите внимание, что при рендеринге с OpenGL вы по-прежнему будете проходить конвейер преобразования, который должен учитываться.

Смежные вопросы