OpenGL - 不使用GLUT添加文本

时间:2014-03-10 15:26:29

标签: c opengl

我想使用OpenGL将字符(x / y / z ..,甚至不是字符串)添加到窗口,不使用GLUT。我知道glutBitmapString(),但我想避免过剩。有什么建议......?

2 个答案:

答案 0 :(得分:3)

上次我为复古风格的游戏做了这个,我创建了一个位图字体,并编写了一个小例程,可以将特定字符作为纹理绘制四边形。另一个选择是以单独的四边形绘制位图字体的每个像素。

您可以在此处找到示例代码:

http://svn.berlios.de/wsvn/pong2/trunk/src/Interface.h http://svn.berlios.de/wsvn/pong2/trunk/src/Interface.cpp

更具体地说:

  • void Interface::createFont()启动位图字体作为每个字符的显示列表
  • void Interface::drawText(const std::string& text)让OpenGL根据字符串的字符
  • 调用显示列表

在这个具体的例子中,我希望字符中有纹理的“像素”,因此每个位图条目都会产生自己的四边形,上面有一个股票纹理。由于较新的OpenGL功能(如FBO和VBO)取代了它们的功能,因此显示列表现在不太受欢迎。我不知道在某些时候显示列表是否也被弃用了。

createFont()中的文本由The Gimp(http://www.gimp.org)导出功能创建。

庆祝20k的屏幕截图:screenshot of retro text rendering

答案 1 :(得分:1)

我建议使用glyph map,它基本上归结为位图纹理,上面分布着一堆字母。加载纹理并绘制四边形,纹理坐标映射到纹理中所需字形的位置。

天真实现中存在一些可以部分缓解的缺点。例如,不是在单独的绘制调用中绘制大量的四边形,而是可以从Java获取一个提示,并创建与GPU缓冲区相关联的不可变字符串,并打包所需的所有verticesuv s将单词绘制到缓冲区中。 (它们不必是不可变的,只要知道如果你需要更长或更短的单词,你将不得不重新分配缓冲区或留出额外的空间来放置新的字母。)

我在尝试学习如何操作时使用的网站可以在这里找到: Bitmap Fonts

我已将此方法与WebGL实现一起使用,并且它运行良好。我甚至编写了一个工具来动态地从<canvas>元素生成纹理。