OpenGL中的简单文本(无GLUT)

OpenGL中的简单文本(无GLUT),opengl,text,Opengl,Text,我正在用C++、SDL和OpenGL制作一个简单的2D平台,现在我想在屏幕上显示文本,例如点、计时器、简单消息 在不同的网站上,我读到位图字体可能是实现这一点的方法,但是有人能给我一个简单易懂的例子,说明如何在OpenGL中使用它们将测试消息输出到屏幕上吗 编辑:我发现了一些有趣的东西,FTGL。教程中的示例代码(第二个链接)看起来非常简单。无法使其在atm机上运行,但稍后将返回 FTTL是一个免费的跨平台开源C++库,它使用FRIETYPE2简化OpenGL应用程序中的字体。FTGL支持位图

我正在用C++、SDL和OpenGL制作一个简单的2D平台,现在我想在屏幕上显示文本,例如点、计时器、简单消息

在不同的网站上,我读到位图字体可能是实现这一点的方法,但是有人能给我一个简单易懂的例子,说明如何在OpenGL中使用它们将测试消息输出到屏幕上吗

编辑:我发现了一些有趣的东西,FTGL。教程中的示例代码(第二个链接)看起来非常简单。无法使其在atm机上运行,但稍后将返回

FTTL是一个免费的跨平台开源C++库,它使用FRIETYPE2简化OpenGL应用程序中的字体。FTGL支持位图、像素贴图、纹理贴图、轮廓、多边形网格和拉伸多边形渲染模式


  • 您必须创建一个位图图像,其中包含要使用的所有字符。最简单的方法是使用固定宽度的字体。然后为每个字母绑定纹理的该部分。几年前我就在Pascal/OpenGL中编写了这样的代码,我将搜索它并发布

    编辑这里是代码

    procedure DisplayString(str: string; l: integer; active: integer; align: integer);
    var i,n: integer;
    s: string;
    begin
      glPushMatrix;
      glTranslatef(0,-l,0);
      if align=1 then glTranslatef(-15,0,0); //left alignment
      if align=3 then glTranslatef(15,0,0);//right aligment
      s:=uppercase(str); // the font is uppercase only
      for i:=1 to length(str)-4 do begin
       n:=ord(s[i]); // get the ASCII code of letter
       glTranslatef(1,0,0);
       if n=32 then continue; //space
       if (n>=48) and (n<=58) then n:=n-47; // translate ascii code to the
       if (n>=65) and (n<=90) then n:=n-53; // corresponding position in the bitmap
          if active=0 then glBindTexture(GL_TEXTURE_2D, font2) // two different font files used
        else glBindTexture(GL_TEXTURE_2D, font);
        glBegin(GL_QUADS); // 1850 is the total width of the bitmap image, 50 is one character
         glTexCoord2f(((n-1)*50/1850)-1, 0.0); glVertex3f(0.0, 0.0,  1.0);
         glTexCoord2f((n*50/1850)-1, 0.0); glVertex3f(1.0, 0.0,  1.0);
         glTexCoord2f((n*50/1850)-1, 1.0); glVertex3f(1.0, 1.0,  1.0);
         glTexCoord2f(((n-1)*50/1850)-1, 1.0); glVertex3f(0.0, 1.0,  1.0);
        glEnd();
        end;
       glPopMatrix;
    end;
    
    过程显示字符串(str:string;l:integer;active:integer;align:integer);
    变量i,n:整数;
    s:字符串;
    开始
    GLP矩阵;
    glTranslatef(0,-l,0);
    如果align=1,则glTranslatef(-15,0,0)//左对齐
    如果align=3,则glTranslatef(15,0,0)//右对齐
    s:=大写字母(str);//该字体仅为大写
    对于i:=1到长度(str)-4,开始
    n:=ord(s[i]);//获取字母的ASCII码
    glTranslatef(1,0,0);
    如果n=32,则继续//空间
    
    如果(n>=48)和(n=65)和(n我使用GLUT中可用的位图字体。JOGL(Java+OpenGL)中的相应调用为:


    这当然可以适应OpenGL+C++。

    < P>当你使用SDL时,为什么不添加? SDL_ttf是一个与SDL一起使用的TrueType字体渲染库 它依赖于freetype2来处理 TrueType字体数据。它允许程序员使用多个TrueType 字体,而无需自己编写字体呈现例程 轮廓字体和抗锯齿功能强大,高质量文本输出 不费吹灰之力就能得到

    您可以使用,它可以使用位图字体输出文本,如下所示:

    #include <SDL/SDL_gfxPrimitives.h>
    #include <SDL/SDL_gfxPrimitives_font.h>
    
    const char *text = "text to render";
    stringColor(sdlSurface, x, y, text, 0xff0000ff);
    
    #包括
    #包括
    const char*text=“要渲染的文本”;
    stringColor(sdlSurface,x,y,text,0xff0000ff);
    
    我不太确定这就是我要说的。为什么我不能只使用一些可用的字体,如arial、verdana等?因为OpenGL无法呈现它们。你可以使用附加库来实现这一点。查看此常见问题解答:
    #include <SDL/SDL_gfxPrimitives.h>
    #include <SDL/SDL_gfxPrimitives_font.h>
    
    const char *text = "text to render";
    stringColor(sdlSurface, x, y, text, 0xff0000ff);