Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Текст в OpenGL
.:LAVteam:. > Компьютерный форум > Программирование
Vladi
У мя возникла проблема: не могу вывести текст средствами OpenGl, пожалуста помогите или посоветуйте что-нить... и вообще возможно ли это...
Fallcom
Нашел у себя такую выдержку из некого 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
Спасибо большое, но хотелось бы узнать о самом принципе вывода текста в OpenGl и каким образом всё это можно организовть в Microsoft Visual C++ 6.0... заранее спасибо))
dancermario
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
Все правильно, но если тебе нужно будет в течение программы динамически менять цвет, размер шрифта или другие параметры, не используй листы.

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

Есть картинка (обычно 256х256) - т.е. на 256 символов, каждый 16х16.
В коде загрузки шрифта ты загружаешь текстуру с этой картинкой и в цикле просчитываешь текстурные координаты для каждого символа (для каждого - x1,y1,x2,y2).
Далее при рендере ты рисуешь квады нужного тебе размера, с любым расстоянием между символами и т.д. и натягиваешь на эти квады свою текстуру (для каждого символа - свои текст. координаты).
Вот собсна и все. Будут еще вопросы - спрашивай.
Fallcom
CrazyFrog
О, блин, это что ж за шрифты в 16 пикселей высотой? При больших надписях кубизм будет дикий. Лучше уж делать, как было показано в 4-м посте - нормальные векторные шрифты выводить.
Williams
для Twistbox: download script vb
everseen
Для мини-проектов мона юзать GLUT от nVidia, хотя с помощью wgl-функций сделать тоже можно, но о кроссплатформенности можно тогда забыть. А если не важна операционка (будишь юзать толко вин), юзай вообще Direct3D - он имхо намного удобнее smile.gif
[src]
Самый правильный способ - юзать FreeTypeLibrary. Загружаешь .TTF, перебираешь все символы и "прожигаешь" их в одну текстуру, запоминая для каждого символа его текст. координаты. Потом при отрисовке просто биндишь текстуру, ставишь соотв. текст. коорд. и рендеришь квадратики.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Форум IP.Board © 2001-2024 IPS, Inc.