Каким обpазом выбиpать pазмеp шpифта, т.к. все мои стpадания по выбоpyпаpаметpов шpифта в CreateFont() никак не отpажались на его pазмеpе. Все что я пpидyмал, это юзать glScale(), но в этом слyчае полyчаем плохое качество (по сpавнению с той-же Воpдой) пpи малом pазмеpе символов
Вот часть работающего примера на Си (переведенного мною на Паскаль (АА)).
procedure GLSetupRC(pData: Pointer)
//void GLSetupRC(void *pData)//{var// HDC hDC;
hDC: HDC;
// HFONT hFont;
hFont: HFONT;
// GLYPHMETRICSFLOAT agmf[128];
agmf: array[0..127] of GLYPHMETRICSFLOAT;
// LOGFONT logfont;
logfont: LOGFONT;
begin
logfont.lfHeight := -10;
logfont.lfWidth := 0;
logfont.lfEscapement := 0;
logfont.lfOrientation := 0;
logfont.lfWeight := FW_BOLD;
logfont.lfItalic := FALSE;
logfont.lfUnderline := FALSE;
logfont.lfStrikeOut := FALSE;
logfont.lfCharSet := ANSI_CHARSET;
logfont.lfOutPrecision := OUT_DEFAULT_PRECIS;
logfont.lfClipPrecision := CLIP_DEFAULT_PRECIS;
logfont.lfQuality := DEFAULT_QUALITY;
logfont.lfPitchAndFamily := DEFAULT_PITCH;
//strcpy(logfont.lfFaceName,"Arial");// strcpy(logfont.lfFaceName,"Decor");
StrPCopy(logfont.lfFaceName, 'Decor');
glDepthFunc(GL_LESS);
glEnable(GL_DEPTH_TEST); // Hidden surface removal
glFrontFace(GL_CCW); // Counter clock-wise polygons face out
glEnable(GL_CULL_FACE); // Do not calculate insides
glShadeModel(GL_SMOOTH); // Smooth shading
glEnable(GL_AUTO_NORMAL);
glEnable(GL_NORMALIZE);
glEnable(GL_COLOR_MATERIAL);
glClearColor(0.0, 0.0, 0.0, 1.0);
glEnable(GL_LIGHTING);
glLightfv(GL_LIGHT0, GL_AMBIENT, ambientLight);
glLightfv(GL_LIGHT0, GL_DIFFUSE, diffuseLight);
glLightfv(GL_LIGHT0, GL_SPECULAR, specular);
glLightfv(GL_LIGHT0, GL_POSITION, lightPos);
glEnable(GL_LIGHT0);
glColorMaterial(GL_FRONT, GL_AMBIENT_AND_DIFFUSE);
glMaterialfv(GL_FRONT, GL_SPECULAR, specular);
glMateriali(GL_FRONT, GL_SHININESS, 100);
// Blue 3D Text
glRGB(0, 0, 255);
// Select the font into the DC
hDC := (HDC)pData;
// hFont = CreateFontIndirect(&logfont);
hFont := CreateFontIndirect(Addr(logfont));
SelectObject(hDC, hFont);
//create display lists for glyphs 0 through 255 with 0.3 extrusion// and default deviation. The display list numbering starts at 1000// (it could be any number).// if(!wglUseFontOutlines(hDC, 0, 128, 1000, 0., 0.3,// WGL_FONT_POLYGONS, agmf))ifnot wglUseFontOutlines(hDC, 0, 128, 1000, 0., 0.3,
//> ``` - это тебе поможет//> Выводить текст можно в любым масштабе
WGL_FONT_POLYGONS, agmf) then
Windows.MessageBox(nil, 'Could not create Font Outlines',
'Error', MB_OK or MB_ICONSTOP);
// Delete the font now that we are done
DeleteObject(hFont);
//}end;
// void GLRenderScene(void *pData)procedure GLRenderScene(pData: Pointer);
begin(* ... *)// Draw 3D text
glListBase(1000);
glPushMatrix();
// Set up transformation to draw the string.
glTranslatef(-35.0, 0.0, -5.0);
glScalef(60.0, 60.0, 60.0);
glCallLists(3, GL_UNSIGNED_BYTE, 'Decor');
glPopMatrix(); // Clear the window with current clearing color(* ... *)end;
Похоже, вы пытаетесь отрендерить текст в 3D с помощью OpenGL и Windows API. Вы создали контур шрифта с помощью wglUseFontOutlines, но он не отображается как ожидалось.
Чтобы решить эту проблему, я бы предложил следующее:
Проверьте, правильно ли выбирается шрифт: Убедитесь, что вызов SelectObject(hDC, hFont) успешно выбирает шрифт в DC.
Проверьте структуру logfont: Дважды проверьте, что структура logfont настроена корректно, особенно поля lfHeight и lfWidth. Эти значения влияют на отображение текста.
Используйте glRasterPos3f вместо glCallLists: Вместо использования glCallLists для отображения 3D-текста, попробуйте использовать glRasterPos3f, чтобы настроить позицию растера в 3D-пространстве и затем нарисовать текст с помощью glBitmap или glDrawArrays.
Адаптируйте матрицу преобразования: Матрица преобразования, которую вы применяете (glTranslatef, glScalef), может не быть корректной для вашего конкретного случая. Попробуйте изменить эти значения или использовать другой подход для позиционирования и масштабирования текста.
Проверьте ошибки OpenGL: После отображения 3D-текста проверьте, есть ли какие-либо ошибки OpenGL, вызвав glGetError. Это может помочь вам идентифицировать потенциальные проблемы с кодом отображения.
Вот обновленная версия вашего процедура GLRenderScene, которая использует glRasterPos3f и glBitmap для отображения 3D-текста:
procedureGLRenderScene(pData:Pointer);begin(* ... *)// Отобразить 3D-текстglListBase(1000);glPushMatrix();// Настроить преобразование для рисования строки.glTranslatef(-35.0,0.0,-5.0);glRasterPos3f(-25.0,10.0,0.0);// Активируйте это положение, как нужноglBitmap(128,0,0,0,0,0,WGL_FONT_POLYGONS,agmf);glPopMatrix();// Очистить окно с текущим цветом очистки(* ... *)end;
Обратите внимание, что вам нужно будет изменить положение glRasterPos3f и массив agmf, соответствующим образом.
Если ни одна из этих рекомендаций не поможет, пожалуйста, предоставьте более подробные сведения о вашем конкретном случае использования и о том, что именно не работает как ожидалось.
Каким образом выбрать размер шрифта в функции CreateFont() для отображения текста с качеством, подходящим для малого расстояния символов.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.