我目前正在为Android平台开发一个小型OpenGL游戏,我想知道是否有一种简单的方法可以在渲染框架的顶部呈现文本(例如显示玩家分数等HUD)。该文本还需要使用自定义字体。
我看到过使用View作为叠加层的示例,但我不确定是否要这样做,因为我可能以后想把游戏移植到其他平台。
有什么想法吗?
我目前正在为Android平台开发一个小型OpenGL游戏,我想知道是否有一种简单的方法可以在渲染框架的顶部呈现文本(例如显示玩家分数等HUD)。该文本还需要使用自定义字体。
我看到过使用View作为叠加层的示例,但我不确定是否要这样做,因为我可能以后想把游戏移植到其他平台。
有什么想法吗?
将文本渲染到纹理中比 Sprite Text 演示看起来要简单,基本思路是使用 Canvas 类将其渲染到位图上,然后将位图传递给 OpenGL 纹理:
// Create an empty, mutable bitmap
Bitmap bitmap = Bitmap.createBitmap(256, 256, Bitmap.Config.ARGB_4444);
// get a canvas to paint over the bitmap
Canvas canvas = new Canvas(bitmap);
bitmap.eraseColor(0);
// get a background image from resources
// note the image format must match the bitmap format
Drawable background = context.getResources().getDrawable(R.drawable.background);
background.setBounds(0, 0, 256, 256);
background.draw(canvas); // draw the background to our bitmap
// Draw the text
Paint textPaint = new Paint();
textPaint.setTextSize(32);
textPaint.setAntiAlias(true);
textPaint.setARGB(0xff, 0x00, 0x00, 0x00);
// draw the text centered
canvas.drawText("Hello World", 16,112, textPaint);
//Generate one texture pointer...
gl.glGenTextures(1, textures, 0);
//...and bind it to our array
gl.glBindTexture(GL10.GL_TEXTURE_2D, textures[0]);
//Create Nearest Filtered Texture
gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_MIN_FILTER, GL10.GL_NEAREST);
gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_MAG_FILTER, GL10.GL_LINEAR);
//Different possible texture parameters, e.g. GL10.GL_CLAMP_TO_EDGE
gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_WRAP_S, GL10.GL_REPEAT);
gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_WRAP_T, GL10.GL_REPEAT);
//Use the Android GLUtils to specify a two-dimensional texture image from our bitmap
GLUtils.texImage2D(GL10.GL_TEXTURE_2D, 0, bitmap, 0);
//Clean up
bitmap.recycle();
Android SDK没有提供任何简单的方法来在OpenGL视图上绘制文本。以下是您可以选择的选项。
我看了一下精灵文本的示例,对于这样一个任务来说,它看起来非常复杂。我也考虑过渲染到纹理上,但担心可能会导致性能问题。也许我只能使用视图,并在需要跨越这个障碍时担心移植的问题 :)
在游戏中使用OpenGL ES有三个原因:
在游戏设计中,绘制文字总是一个问题,因为你正在绘制物体,所以不能像常规活动那样具有外观和感觉,带有小部件等等。
您可以使用框架从TrueType字体生成位图字体并呈现它们。我见过的所有框架都以相同的方式操作:在绘制时为文本生成顶点和纹理坐标。这不是OpenGL最有效的使用方式。
最好的方法是在代码早期分配远程缓冲区(顶点缓冲对象-VBO),避免在绘制时进行惰性存储器传输操作。
请记住,游戏玩家不喜欢阅读文本,因此您不会编写长动态生成的文本。对于标签,您可以使用静态纹理,将动态文本留给时间和得分,两者都是数字且只有少数字符。
因此,我的解决方案很简单:
如果使用远程静态缓冲区,绘制操作会很快。
我创建了一个XML文件,其中包含屏幕位置(基于屏幕对角线百分比)和纹理(静态和字符),然后在渲染之前加载此XML。
要获得高FPS率,您应避免在绘制时生成VBO。
请查看CBFG
和Android端的加载/渲染代码。您应该能够将代码放入您的项目中并立即使用。
我在使用这个实现时遇到了问题。当我尝试更改字体位图的大小(我需要特殊字符)时,它只显示一个字符,整个绘制失败 :(