我正在使用 C ++,SDL和OpenGL 创建一个简单的2D平台游戏,现在我想在屏幕上显示文本,例如点,计时器,简单的消息。
在各种网站上我已经读过Bitmap Fonts可能是这样做的方法,但有人可以给我一个直截了当,易于理解的例子,说明如何在OpenGL中使用它们来输出测试消息屏幕?
编辑:我发现了一些有趣的内容, FTGL 。教程(第2个链接)中的示例代码看起来非常简单。无法让它工作,但稍后会再回到它。
FTGL是一个免费的跨平台开源C ++库,它使用Freetype2来简化OpenGL应用程序中的字体渲染。 FTGL支持位图,像素图,纹理贴图,轮廓,多边形网格和拉伸多边形渲染模式。
答案 0 :(得分:2)
您可以使用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);
答案 1 :(得分:1)
当您使用SDL时,为什么不添加SDL_ttf?
SDL_ttf是与SDL一起使用的TrueType字体呈现库 库,几乎同样便携。它取决于freetype2来处理 TrueType字体数据。它允许程序员使用多个TrueType 字体而不必自己编写字体渲染例程。同 轮廓字体和抗锯齿的强大功能,高质量的文本输出 可以毫不费力地获得。
答案 2 :(得分:0)
您必须创建一个位图图像,其中包含您要使用的所有字符。最简单的方法是使用固定宽度的字体。然后为每个字母绑定纹理的那一部分。我几年前在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;
答案 3 :(得分:-2)
我使用了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 ++。