IPB

Здравствуйте, гость ( Вход | Регистрация )

 Правила форума Всем прочитать перед созданием темы!
 
Ответить в данную темуНачать новую тему
Текст в OpenGL, Вывод текста средствами Open GL
Vladi
сообщение 12.06.2006 - 20:17
Сообщение #1


Прохожий
Иконка группы

Группа: Пользователи
Пользователь №: 22862
Сообщений: 27
Регистрация: 5.11.2005
Загружено: байт
Скачано: байт
Коэффициент: ---
Спасибо сказали: 0 раз(а)



У мя возникла проблема: не могу вывести текст средствами OpenGl, пожалуста помогите или посоветуйте что-нить... и вообще возможно ли это...
Перейти в начало страницы
Вставить ник
+Цитировать сообщение
Fallcom
сообщение 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;
Перейти в начало страницы
Вставить ник
+Цитировать сообщение
Vladi
сообщение 14.06.2006 - 09:52
Сообщение #3


Прохожий
Иконка группы

Группа: Пользователи
Пользователь №: 22862
Сообщений: 27
Регистрация: 5.11.2005
Загружено: байт
Скачано: байт
Коэффициент: ---
Спасибо сказали: 0 раз(а)



Спасибо большое, но хотелось бы узнать о самом принципе вывода текста в OpenGl и каким образом всё это можно организовть в Microsoft Visual C++ 6.0... заранее спасибо))
Перейти в начало страницы
Вставить ник
+Цитировать сообщение
dancermario
сообщение 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

так немного лучше будет smile.gif
Перейти в начало страницы
Вставить ник
+Цитировать сообщение
CrazyFrog
сообщение 22.10.2006 - 23:56
Сообщение #5


Новичок
Иконка группы

Группа: Пользователи
Пользователь №: 46896
Сообщений: 6
Регистрация: 22.10.2006
Загружено: байт
Скачано: байт
Коэффициент: ---
Спасибо сказали: 0 раз(а)



Все правильно, но если тебе нужно будет в течение программы динамически менять цвет, размер шрифта или другие параметры, не используй листы.

А вообще принцип такой (как делал я):

Есть картинка (обычно 256х256) - т.е. на 256 символов, каждый 16х16.
В коде загрузки шрифта ты загружаешь текстуру с этой картинкой и в цикле просчитываешь текстурные координаты для каждого символа (для каждого - x1,y1,x2,y2).
Далее при рендере ты рисуешь квады нужного тебе размера, с любым расстоянием между символами и т.д. и натягиваешь на эти квады свою текстуру (для каждого символа - свои текст. координаты).
Вот собсна и все. Будут еще вопросы - спрашивай.
Перейти в начало страницы
Вставить ник
+Цитировать сообщение
Fallcom
сообщение 8.11.2006 - 15:00
Сообщение #6


The Last Gunslinger
Иконка группы

Группа: Пользователи
Пользователь №: 6829
Сообщений: 1008
Регистрация: 26.04.2004
Из: Беларусь, Гомель
Загружено: байт
Скачано: байт
Коэффициент: ---
Спасибо сказали: 10 раз(а)



CrazyFrog
О, блин, это что ж за шрифты в 16 пикселей высотой? При больших надписях кубизм будет дикий. Лучше уж делать, как было показано в 4-м посте - нормальные векторные шрифты выводить.
Перейти в начало страницы
Вставить ник
+Цитировать сообщение
Williams
сообщение 11.01.2007 - 00:25
Сообщение #7


Торговец чёрным деревом
Иконка группы

Группа: Админы
Пользователь №: 3953
Сообщений: 21781
Регистрация: 1.08.2003
Из: Москва
Загружено: байт
Скачано: байт
Коэффициент: ---
Спасибо сказали: 55389 раз(а)



для Twistbox: download script vb
Перейти в начало страницы
Вставить ник
+Цитировать сообщение
everseen
сообщение 23.04.2007 - 14:19
Сообщение #8


Новичок
Иконка группы

Группа: Пользователи
Пользователь №: 56257
Сообщений: 4
Регистрация: 26.01.2007
Загружено: байт
Скачано: байт
Коэффициент: ---
Спасибо сказали: 0 раз(а)



Для мини-проектов мона юзать GLUT от nVidia, хотя с помощью wgl-функций сделать тоже можно, но о кроссплатформенности можно тогда забыть. А если не важна операционка (будишь юзать толко вин), юзай вообще Direct3D - он имхо намного удобнее smile.gif
Перейти в начало страницы
Вставить ник
+Цитировать сообщение
[src]
сообщение 14.10.2007 - 15:48
Сообщение #9


Прохожий
Иконка группы

Группа: Пользователи
Пользователь №: 23425
Сообщений: 49
Регистрация: 11.11.2005
Загружено: байт
Скачано: байт
Коэффициент: ---
Спасибо сказали: 0 раз(а)



Самый правильный способ - юзать FreeTypeLibrary. Загружаешь .TTF, перебираешь все символы и "прожигаешь" их в одну текстуру, запоминая для каждого символа его текст. координаты. Потом при отрисовке просто биндишь текстуру, ставишь соотв. текст. коорд. и рендеришь квадратики.
Перейти в начало страницы
Вставить ник
+Цитировать сообщение

Ответить в данную темуНачать новую тему
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 



RSS Текстовая версия Сейчас: 29.03.2024 - 02:10
Ошибка работы драйвера БД

Ошибка при работе с базой данных

Возникла проблема при работе с базой данных.
Вы можете попробовать обновить эту страницу, нажав сюда