OpenGL 中的简单文本(无 GLUT)

发布于 2024-11-30 19:07:35 字数 865 浏览 0 评论 0 原文

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

在各个网站上,我读到位图字体可能是解决此问题的方法,但是有人可以给我一个简单易懂的示例,说明如何在 OpenGL 中使用它们将测试消息输出到屏幕吗?

编辑:我发现了一些有趣的东西,FTGL。本教程(第二个链接)中的示例代码看起来非常简单。无法让它在自动取款机上工作,但稍后会再回来。

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

  1. http: //sourceforge.net/projects/ftgl/
  2. http://ftgl.sourceforge.net/docs/html/ftgl-tutorial.html
  3. http://nehe.gamedev.net/tutorial/freetype_fonts_in_opengl/24001/

I am making a simple 2D platformer with C++, SDL and OpenGL and now I would like to display text on the screen, e.g. points, timer, simple messages.

On various site's I've read that Bitmap Fonts would probably be the way to go for this, but could someone please give me a straightforward, easy to understand example of how to use them in OpenGL to output a test-message to the screen?

EDIT: I found something interesting, FTGL. The example-code in the tutorial (2nd link) looks very straightforward. Couldn't get it to work atm but will go back to it later.

FTGL is a free cross-platform Open Source C++ library that uses Freetype2 to simplify rendering fonts in OpenGL applications. FTGL supports bitmaps, pixmaps, texture maps, outlines, polygon mesh, and extruded polygon rendering modes.

  1. http://sourceforge.net/projects/ftgl/
  2. http://ftgl.sourceforge.net/docs/html/ftgl-tutorial.html
  3. http://nehe.gamedev.net/tutorial/freetype_fonts_in_opengl/24001/

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

终难愈 2024-12-07 19:07:35

您可以使用 SDL_gfx,它可以输出文本使用像这样的位图字体:

#include <SDL/SDL_gfxPrimitives.h>
#include <SDL/SDL_gfxPrimitives_font.h>

const char *text = "text to render";
stringColor(sdlSurface, x, y, text, 0xff0000ff);

You can use SDL_gfx, it can output text using bitmap fonts like this:

#include <SDL/SDL_gfxPrimitives.h>
#include <SDL/SDL_gfxPrimitives_font.h>

const char *text = "text to render";
stringColor(sdlSurface, x, y, text, 0xff0000ff);
稀香 2024-12-07 19:07:35

您必须创建一个位图图像,其中包含要使用的所有字符。最简单的方法是使用固定宽度的字体。然后为每个字母绑定纹理的该部分。我几年前在 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;

You have to create a bitmap image, containing all the characters you want to use. The easiest way is with a fixed-width font. Then for each letter you bind that part of the texture. I've written such code in Pascal/OpenGL years ago, will search for it and post

Edit here is the code

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;
难理解 2024-12-07 19:07:35

当您已经使用 SDL 时,为什么不添加 SDL_ttf 呢?

SDL_ttf 是与 SDL 一起使用的 TrueType 字体渲染库
库,并且几乎同样便携。它依赖于 freetype2 来处理
TrueType 字体数据。它允许程序员使用多个 TrueType
字体,而无需自己编写字体渲染例程。和
轮廓字体和抗锯齿的强大功能,高质量的文本输出
无需太多努力即可获得。

When you use SDL already why not add SDL_ttf?

SDL_ttf is a TrueType font rendering library that is used with the SDL
library, and almost as portable. It depends on freetype2 to handle the
TrueType font data. It allows a programmer to use multiple TrueType
fonts without having to code a font rendering routine themselves. With
the power of outline fonts and antialiasing, high quality text output
can be obtained without much effort.

薄暮涼年 2024-12-07 19:07:35

我使用了 GLUT 中提供的位图字体。 JOGL(Java + OpenGL)中的相应调用是:

GLU glu = new GLU();
GLUT glut = new GLUT();
GL gl = drawable.getGL();
gl.glRasterPos3f(x, y, z); // move to (x, y, z) for the next text output
glut.glutBitmapString(GLUT.BITMAP_HELVETICA_12, "Message");
gl.glRasterPos3f (x2, y2, z2);
glut.glutBitmapCharacter (GLUT.BITMAP_HELVETICA_18, 'X');

这肯定可以轻松适应OpenGL + C++。

I used bitmap fonts that are available in GLUT. The respective calls in JOGL (Java + OpenGL) are:

GLU glu = new GLU();
GLUT glut = new GLUT();
GL gl = drawable.getGL();
gl.glRasterPos3f(x, y, z); // move to (x, y, z) for the next text output
glut.glutBitmapString(GLUT.BITMAP_HELVETICA_12, "Message");
gl.glRasterPos3f (x2, y2, z2);
glut.glutBitmapCharacter (GLUT.BITMAP_HELVETICA_18, 'X');

This can surely be adapted to OpenGL + C++ easily.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文