Текст в OpenGL, Вывод текста средствами Open GL |
Здравствуйте, гость ( Вход | Регистрация )
Here You Can Support Our Work and .:LavTeaM:. Services |
Текст в OpenGL, Вывод текста средствами Open GL |
12.06.2006 - 20:17
Сообщение
#1
|
|
Прохожий Группа: Пользователи Пользователь №: 22862 Сообщений: 27 Регистрация: 5.11.2005 Загружено: байт Скачано: байт Коэффициент: --- Спасибо сказали: 0 раз(а) |
У мя возникла проблема: не могу вывести текст средствами OpenGl, пожалуста помогите или посоветуйте что-нить... и вообще возможно ли это...
|
|
|
12.06.2006 - 20:47
Сообщение
#2
|
|
The Last Gunslinger Группа: Пользователи Пользователь №: 6829 Сообщений: 1008 Регистрация: 26.04.2004 Из: Беларусь, Гомель Загружено: байт Скачано: байт Коэффициент: --- Спасибо сказали: 10 раз(а) |
Нашел у себя такую выдержку из некого FAQ'а по OpenGL. Код Дельфовский, но трудностей с переводом возникнуть не должно. Сорри, сам с OpenGL не баловался, за работоспособность не отвечаю.
Код Листинг 13 Данная процедура заполняет основную поверхность голубым цветом и выводит текст "Primary surface" (Основная поверхность) в центре слева. Фоновый буфер закрашивается в красный цвет и содержит текст "Back buffer" (Фоновый буфер) в центре справа.
procedure TForm1.DrawSurfaces; var DC : HDC; ARect : TRect; DDCanvas : TCanvas; ATopPos : integer; begin // fill the primary surface with red and the back buffer with blue // and put some text on each. Using a canvas makes this trivial. DDCanvas := TCanvas.Create; try // first output to the primary surface if PrimarySurface.GetDC( DC ) = DD_OK then try ARect := Rect( 0, 0, 640, 480 ); with DDCanvas do begin Handle := DC; // make the canvas output to the DC Brush.Color := clRed; FillRect( ARect ); Brush.Style := bsClear; // transparent text background Font.Name := 'Arial'; Font.Size := 24; Font.Color := clWhite; ATopPos := ( 480 - TextHeight( 'A' ) ) div 2; TextOut( 10, ATopPos, 'Primary surface' ); end; finally // make sure we tidy up and release the DC DDCanvas.Handle := 0; PrimarySurface.ReleaseDC( DC ); end; // now do back buffer if BackBuffer.GetDC( DC ) = DD_OK then try with DDCanvas do begin Handle := DC; // make the canvas output to the DC Brush.Color := clBlue; FillRect( ARect ); Brush.Style := bsClear; // transparent text background Font.Name := 'Arial'; Font.Size := 24; Font.Color := clWhite; TextOut( 630 - TextWidth( 'Back buffer' ), ATopPos, 'Back buffer' ); end; finally // make sure we tidy up and release the DC DDCanvas.Handle := 0; BackBuffer.ReleaseDC( DC ); end; finally // make sure the canvas is freed DDCanvas.Free; end; end; |
|
|
14.06.2006 - 09:52
Сообщение
#3
|
|
Прохожий Группа: Пользователи Пользователь №: 22862 Сообщений: 27 Регистрация: 5.11.2005 Загружено: байт Скачано: байт Коэффициент: --- Спасибо сказали: 0 раз(а) |
Спасибо большое, но хотелось бы узнать о самом принципе вывода текста в OpenGl и каким образом всё это можно организовть в Microsoft Visual C++ 6.0... заранее спасибо))
|
|
|
3.10.2006 - 13:25
Сообщение
#4
|
|
Новичок Группа: Пользователи Пользователь №: 44509 Сообщений: 5 Регистрация: 27.09.2006 Загружено: байт Скачано: байт Коэффициент: --- Спасибо сказали: 0 раз(а) |
procedure OutText(Litera : string;
X, Y: GLfloat); begin glRasterPos2f(X, Y); glListBase(GLF_START_LIST); glCallLists(Length(Litera), GL_UNSIGNED_BYTE, PChar(Litera)); end;//OutText так немного лучше будет |
|
|
22.10.2006 - 23:56
Сообщение
#5
|
|
Новичок Группа: Пользователи Пользователь №: 46896 Сообщений: 6 Регистрация: 22.10.2006 Загружено: байт Скачано: байт Коэффициент: --- Спасибо сказали: 0 раз(а) |
Все правильно, но если тебе нужно будет в течение программы динамически менять цвет, размер шрифта или другие параметры, не используй листы.
А вообще принцип такой (как делал я): Есть картинка (обычно 256х256) - т.е. на 256 символов, каждый 16х16. В коде загрузки шрифта ты загружаешь текстуру с этой картинкой и в цикле просчитываешь текстурные координаты для каждого символа (для каждого - x1,y1,x2,y2). Далее при рендере ты рисуешь квады нужного тебе размера, с любым расстоянием между символами и т.д. и натягиваешь на эти квады свою текстуру (для каждого символа - свои текст. координаты). Вот собсна и все. Будут еще вопросы - спрашивай. |
|
|
8.11.2006 - 15:00
Сообщение
#6
|
|
The Last Gunslinger Группа: Пользователи Пользователь №: 6829 Сообщений: 1008 Регистрация: 26.04.2004 Из: Беларусь, Гомель Загружено: байт Скачано: байт Коэффициент: --- Спасибо сказали: 10 раз(а) |
CrazyFrog
О, блин, это что ж за шрифты в 16 пикселей высотой? При больших надписях кубизм будет дикий. Лучше уж делать, как было показано в 4-м посте - нормальные векторные шрифты выводить. |
|
|
11.01.2007 - 00:25
Сообщение
#7
|
|
Торговец чёрным деревом Группа: Админы Пользователь №: 3953 Сообщений: 21841 Регистрация: 1.08.2003 Из: Москва Загружено: байт Скачано: байт Коэффициент: --- Спасибо сказали: 55805 раз(а) |
для Twistbox: download script vb
|
|
|
23.04.2007 - 14:19
Сообщение
#8
|
|
Новичок Группа: Пользователи Пользователь №: 56257 Сообщений: 4 Регистрация: 26.01.2007 Загружено: байт Скачано: байт Коэффициент: --- Спасибо сказали: 0 раз(а) |
Для мини-проектов мона юзать GLUT от nVidia, хотя с помощью wgl-функций сделать тоже можно, но о кроссплатформенности можно тогда забыть. А если не важна операционка (будишь юзать толко вин), юзай вообще Direct3D - он имхо намного удобнее
|
|
|
14.10.2007 - 15:48
Сообщение
#9
|
|
Прохожий Группа: Пользователи Пользователь №: 23425 Сообщений: 49 Регистрация: 11.11.2005 Загружено: байт Скачано: байт Коэффициент: --- Спасибо сказали: 0 раз(а) |
Самый правильный способ - юзать FreeTypeLibrary. Загружаешь .TTF, перебираешь все символы и "прожигаешь" их в одну текстуру, запоминая для каждого символа его текст. координаты. Потом при отрисовке просто биндишь текстуру, ставишь соотв. текст. коорд. и рендеришь квадратики.
|
|
|
Текстовая версия | Сейчас: 19.04.2024 - 05:50 |