我想使用OpenGL将字符(x / y / z ..,甚至不是字符串)添加到窗口,不使用GLUT。我知道glutBitmapString(),但我想避免过剩。有什么建议......?
答案 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的屏幕截图:
答案 1 :(得分:1)
我建议使用glyph map
,它基本上归结为位图纹理,上面分布着一堆字母。加载纹理并绘制四边形,纹理坐标映射到纹理中所需字形的位置。
天真实现中存在一些可以部分缓解的缺点。例如,不是在单独的绘制调用中绘制大量的四边形,而是可以从Java获取一个提示,并创建与GPU缓冲区相关联的不可变字符串,并打包所需的所有vertices
和uv
s将单词绘制到缓冲区中。 (它们不必是不可变的,只要知道如果你需要更长或更短的单词,你将不得不重新分配缓冲区或留出额外的空间来放置新的字母。)
我在尝试学习如何操作时使用的网站可以在这里找到: Bitmap Fonts
我已将此方法与WebGL实现一起使用,并且它运行良好。我甚至编写了一个工具来动态地从<canvas>
元素生成纹理。