sha*_*zed 126 android opengl-es text-rendering
我正在为Android平台开发一个小型的OpenGL游戏,我想知道是否有一种简单的方法可以在渲染帧的顶部渲染文本(比如带有玩家得分的HUD等).文本也需要使用自定义字体.
我已经看过使用View作为叠加层的示例,但我不知道是否要这样做,因为我可能希望稍后将游戏移植到其他平台.
有任何想法吗?
JVi*_*ela 164
将文本渲染到纹理比Sprite Text演示使其看起来更简单,基本思想是使用Canvas类渲染到Bitmap,然后将Bitmap传递给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();
Run Code Online (Sandbox Code Playgroud)
Dav*_*ave 101
Android SDK没有任何简单的方法在OpenGL视图上绘制文本.离开你有以下选择.
根据这个链接:
http://code.neenbedankt.com/how-to-render-an-android-view-to-a-bitmap
您可以将任何视图渲染到位图.可能值得假设您可以根据需要布局视图(包括文本,图像等),然后将其渲染为位图.
使用上面的JVitela代码,您应该能够将该Bitmap用作OpenGL纹理.
小智 7
看一下CBFG和加载/渲染代码的Android端口.您应该能够将代码放入项目中并立即使用它.
CBFG - http://www.codehead.co.uk/cbfg
Android加载程序 - http://www.codehead.co.uk/cbfg/TexFont.java
小智 5
恕我直言,在游戏中使用 OpenGL ES 有以下三个原因:
绘制文本始终是游戏设计中的一个问题,因为您正在绘制东西,因此您无法拥有常见活动(例如小部件等)的外观和感觉。
您可以使用框架从 TrueType 字体生成位图字体并渲染它们。我见过的所有框架都以相同的方式运行:在绘制时生成文本的顶点和纹理坐标。这并不是 OpenGL 最有效的使用方式。
最好的方法是在代码的早期为顶点和纹理分配远程缓冲区(顶点缓冲区对象 - VBO),避免绘制时的惰性内存传输操作。
请记住,游戏玩家不喜欢阅读文本,因此您不会编写长的动态生成的文本。对于标签,您可以使用静态纹理,保留时间和分数的动态文本,两者都是带有几个字符长的数字。
所以,我的解决方案很简单:
如果您使用远程静态缓冲区,绘制操作会很快。
我创建一个包含屏幕位置(基于屏幕对角线百分比)和纹理(静态和字符)的 XML 文件,然后在渲染之前加载此 XML。
为了获得高 FPS 速率,您应该避免在绘制时生成 VBO。
| 归档时间: |
|
| 查看次数: |
107110 次 |
| 最近记录: |