Creating the font texture on-the-fly is easy if you have some kind of surface to draw the fonts in the system to, like TBitMap.

Here's some old code of mine, should be easy to port to Lazarus:

[pascal]
{$R-}
unit J3D_Text;

interface

uses Windows, OpenGL, Graphics;

type
ThTexture = array [0..0] of Byte;
TTexture = ^ThTexture;

TTextureFont = record
S1, T1, S2, T2: Single;
Width, Height: Integer;
end;

var
TextureFont: array [' ' .. '~'] of TTextureFont;
TextureID: Longword;
TextureSize: Longword;
FontTexture: TTexture; // Texture


procedure Text_LoadFont(Fontname: String; Size: Integer; Color: TColor);

implementation

procedure Text_LoadFont(Fontname: String; Size: Integer; Color: TColor);

const
z: Integer = 0;
var
BitMap: TBitMap;
x: Integer;
y: Integer;
y2: Integer;
z2: Integer;
Delphi_Color: TColor;
Font: TFont;

FontHeight: Integer;
r: TRect;
CharWidths: array [0..255] of Integer;
CharHeights: array [0..255] of Integer;
FontWidth: Integer;
Step: Single;
Chr: Char;
begin
// Create and load bitmap
BitMap := TBitMap.Create;
//BitMap.LoadFromFile(FileName);
BitMap.PixelFormat := pf24bit;

BitMap.Width := 256;
BitMap.Height := 256;

r.Left := 0;
r.Right := 256;
r.Top := 0;
r.Bottom := 256;

BitMap.Canvas.Brush.Color := clBlack;
BitMap.Canvas.Brush.Style := bsSolid;
BitMap.Canvas.Pen.Color := clBlack;
BitMap.Canvas.FillRect(r);
BitMap.Canvas.Font.Name := Fontname; // Arial
BitMap.Canvas.Font.Size := Size; // 18
BitMap.Canvas.Font.Color := Color; //clWhite
BitMap.Canvas.Font.Style := [];
FontWidth := BitMap.Canvas.Font.Size - 4;
FontHeight := Round(BitMap.Canvas.Font.Size * BitMap.Canvas.Font.PixelsPerInch / 72);

for x := 0 to 255 do
CharWidths[x] := BitMap.Canvas.TextWidth(Char(x));

FontHeight := 0;
for x := 0 to 255 do
begin
CharHeights[x] := BitMap.Canvas.TextHeight(Char(x));
if BitMap.Canvas.TextHeight(Char(x)) > FontHeight then
FontHeight := BitMap.Canvas.TextHeight(Char(x));
end;

Step := 1 / 256;

x := 0;
y := 255 - FontHeight;
y2 := 0;
for z2 := 32 to 126 do
begin
Chr := Char(z);
FontWidth := CharWidths[z2];
//FontHeight := CharHeights[z];
if (x + FontWidth) > 255 then
begin
x := 0;
y := y - FontHeight;
//y := y + FontHeight;
y2 := y2 + FontHeight;
end;

TextureFont[Char(z2)].S1 := x * Step;
TextureFont[Char(z2)].T1 := y2 * Step;
TextureFont[Char(z2)].Width := FontWidth-1;
TextureFont[Char(z2)].S2 := (x + FontWidth-1) * Step;
TextureFont[Char(z2)].T2 := (y2 + CharHeights[z2]) * Step;
TextureFont[Char(z2)].Height := CharHeights[z2];
BitMap.Canvas.TextOut(x, y, Char(z2));
x := x + FontWidth;
end;

// Create and set size of texture
TextureSize := BitMap.Width * BitMap.Height;

GetMem(FontTexture, TextureSize * 3);

//BitMap.SaveToFile('c:\temp\font.bmp');

// Position in texture
z := 0;
for y := BitMap.Height - 1 downto 0 do
begin
for x := 0 to BitMap.Width - 1 do
begin
// Converts Delphi Color value to RGB values, no Alpha
Delphi_Color := BitMap.Canvas.Pixels[x, y];
FontTexture[z] := Lo(LoWord(Delphi_Color));
Inc(z);
FontTexture[z] := Hi(LoWord(Delphi_Color));
Inc(z);
FontTexture[z] := Lo(HiWord(Delphi_Color));
Inc(z);
end;
end;
// glGenTextures(1, TextureID);
TextureID := 100;
glBindTexture(GL_TEXTURE_2D, TextureID);

// Used texture format is size = 256x256, format = 3 (RGB) and type unsigned byte
glTexImage2D(GL_TEXTURE_2D, 0, 3, 256, 256, 0, GL_RGB, GL_UNSIGNED_BYTE, FontTexture);
glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP);

BitMap.Free;
end;

initialization

finalization
if FontTexture <> NIL then
FreeMem(FontTexture, TextureSize * 3);

end.
[/pascal]