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