描きのテキストOpenGL ES
-
20-09-2019 - |
質問
私は現在開発中の小さなOpenGLゲームのAndroidプラットフォームだが、方法などについてはテキストを描画する上に描画されるフレームのようにHUDの選手の得点です。テキストを利用する必要があり、カスタムフォントもございます
私は見た事例を用いてオーバーレイがんばりたいならいいかもしれませんね港のゲームは、他のプラットフォームです。
そのアイデア?
解決
Android SDKいず簡単に文字列を描画OpenGLます。かを、次の中から選択します。
- 所TextView過ごSurfaceView. これは悪いが、アルファベットをクリックす。
- 描画する共通文字列を感で描きの方に質感。 で、これまで最もシンプルで、最速、最も柔軟性があります。
- ロール自分で自分のテキスト文字描画コードに基づくスプライト. うセカンドベストの選択肢が2ではないオプションです。良くわかりやすく伝えるための足が濡れることに注意してくださかのシーンには、基本的な機能については、取得しっとりとしてい追加機能(ルチアライメント対応ライン-ブレイク、可変幅フォント等) -このルートで簡単に取得することができ離れです!
- 使用のオープンソースの図書館があります。 が周りのご狩りGoogle、トリッキーなビットはされて来ていますが、これに統合いよいよスタートしました。しかし、少なくとも、一度でもいいの柔軟性と残います。
他のヒント
テクスチャにテキストをレンダリングするスプライトテキストのデモは、基本的な考え方は、ビットマップにレンダリングして、OpenGLのテクスチャにビットマップを渡すために、Canvasクラスを使用することで、同じように見える作るものよりも簡単です
// 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();
私が書いたチュートリアル>これは JVitelaするによって投稿答えに拡大します。基本的には(初期化が完了すると)なし、さらにスローダウンとフルダイナミックテキストのレンダリングを可能にするために、それは同じ考えを使用していますが、代わりにテクスチャに各文字列を描画するのではなく、テクスチャにフォントファイルからのすべての文字をレンダリングし、それを使用していますます。
様々なフォントアトラス発電機に比べて私の方法の主な利点は、あなたの代わりにすべてのフォントバリエーションとサイズに大きなビットマップを出荷するのでプロジェクトに小さなフォントファイル(の.ttf .OTF)を出荷することができるということです。それが唯一のフォントファイルを使用して、任意の解像度で完璧な品質のフォントを生成することができます。)
チュートリアルには、任意のプロジェクトで使用することができますフルコード:)
このリンクによるます:
のhttp://code.neenbedankt .COM /ハウツーレンダリング-アンドロイド・ビュー・ツー・ビットマップの
あなたはビットマップへのいずれかのビューををレンダリングすることができます。それはあなたが(など、テキスト、画像を含む)を必要としてビューをレイアウトして、ビットマップにそれをレンダリングすることができることを仮定して、おそらく価値がある。
次のことができるようにする必要がありの上JVitelaのコード使い方OpenGLのテクスチャとしてそのビットマップを使用します。
CBFGを見て、ロード/レンダリングコードのAndroidのポートを取ります。あなたは、あなたのプロジェクトにコードをドロップすると、すぐにそれを使用することができる必要があります。
CBFG - http://www.codehead.co.uk/cbfg の
アンドロイドローダー - http://www.codehead.co.uk/cbfg/TexFont.java
私はスプライトのテキストの例を見て、それは、そのようなタスクのためにひどく複雑に見えます、私はあまりにもテクスチャにレンダリングすると考えられますが、私は可能性がありますパフォーマンスヒット心配です。 私はだけではなく、ビューに行くと、それはその橋を渡るする時が来た時に、移植を心配する必要がある場合があります。)
"スプライトテキスト" サンプル GLSurfaceViewサンプル。
まぁについて利用OpenGL ESは、ゲーム:
- 回避の違いモバイルプラットフォームによるオープン標準
- より制御の描画プロセス
- 利用GPUの並列処理
絵文字は常に問題のあるゲームデザインですが、図面も、できない場合もありますので、共通の、ステークホルダーとのコミュニウィジェットです。
利用できる枠組みをビットマップフォントからのTrueTypeフォントの描画をします。すべての枠組みから運用と同じ方法:の頂点と食感の座標は、テキストを描きます。これは、最も効率的な利用のOpenGL.
最良の方法で配分のリモートバッファ(頂点バッファオブジェクト-VBOs)を頂点とその質感早くコードを避けること怠け者の記憶の継承作業を描きます。
このゲーム選んで読めるようになりたいテキスト、でんすを動的に生成されます。ラベルを使用でき静質感、ダイナミックテキストのための時点で、両方の数字と数字の長さです。
でもソフトバンクグループ
- 作成感のための共通のラベル警告;
- 作成感のための番号0-9, ":", "+", を"-".一感のための各キャラクター;
- をリモートVBOsのポジションの画面になります。私の描画は、静止画/動画アクイジションテキストに位置すが、VBOsは静的;
- 生で食感VBO、テキストは常に描画される一方;
- に描き、描画の静的なテキスト;
- 動的テキストでpeekの位置VBO、文字の質感を引き出すキャラクターです。
描画操作は、ご利用の場合リモートの静的バッファ.
私が作成したXMLファイルで画面の位置に基づく画面の対角率やテクスチャ(静的および文字)、その負荷はこのXML前rendering.
高FPS率、どうしたらよいかということです生成VBOsで描きます。
あなたはGLを使う、という場合は、テクスチャの上にテキストをレンダリングすることができます。 HUDのほとんどが比較的静的であると仮定すると、あなたはあまりにも多くの場合、テクスチャメモリにテクスチャをロードする必要はありません。
見 CBFG
のAndroidポートに積み込み/レンダリング
コードです。対応することができるでしょう落としのコードをプロジェクトに使用し
直線距離です。
い問題ができます。で表示一つだけの文字がっていない変更フォントのサイズのビットマップ(い特殊文字全体を描画に失敗した:(
私は数時間のために、このを探している、これは私が来た最初の記事はaccrossだったし、それが最良の答えを持っているが、私が考える最も人気のある答えは的外れです。確かに私は必要なもののために。 weichselさんとshakazedの答えは、ボタンの上で右だったが、少しは記事に隠さ。 右のプロジェクトにあなたを置くために。ここに: ただ、既存のサンプルに基づいて、新しいAndroidのプロジェクトを作成します。 ApiDemosを選択します:
ソースフォルダの下に見て、
ApiDemos/src/com/example/android/apis/graphics/spritetext
そして、あなたはあなたが必要なすべてを見つけるでしょう。
のための 静的なテキスト:
- 生成されるすべての言葉が使用されるPC(例えば、GIMP).
- 負荷としての質感として使用し材料です。
のための 長いテキスト を更新する必要があるということば:
- ましょうandroidに描きのビットマップキャンバス(JVitelaのです。
- 荷重をこの素材として。
- 利用の異なる質感の座標は各言葉です。
のための 多数 (形式の00.0):
- 生成されるすべての番号にコンテントタイプにマップ
- 荷重をこの素材として。
- 以下のご利用シェーダー.
おonDrawイベントの更新のみの値を変数に送信されシェーダー.
precision highp float; precision highp sampler2D; uniform float uTime; uniform float uValue; uniform vec3 iResolution; varying vec4 v_Color; varying vec2 vTextureCoord; uniform sampler2D s_texture; void main() { vec4 fragColor = vec4(1.0, 0.5, 0.2, 0.5); vec2 uv = vTextureCoord; float devisor = 10.75; float digit; float i; float uCol; float uRow; if (uv.y < 0.45) { if (uv.x > 0.75) { digit = floor(uValue*10.0); digit = digit - floor(digit/10.0)*10.0; i = 48.0 - 32.0 + digit; uRow = floor(i / 10.0); uCol = i - 10.0 * uRow; fragColor = texture2D( s_texture, uv / devisor * 2.0 + vec2((uCol-1.5) / devisor, uRow / devisor) ); } else if (uv.x > 0.5) { uCol = 4.0; uRow = 1.0; fragColor = texture2D( s_texture, uv / devisor * 2.0 + vec2((uCol-1.0) / devisor, uRow / devisor) ); } else if (uv.x > 0.25) { digit = floor(uValue); digit = digit - floor(digit/10.0)*10.0; i = 48.0 - 32.0 + digit; uRow = floor(i / 10.0); uCol = i - 10.0 * uRow; fragColor = texture2D( s_texture, uv / devisor * 2.0 + vec2((uCol-0.5) / devisor, uRow / devisor) ); } else if (uValue >= 10.0) { digit = floor(uValue/10.0); digit = digit - floor(digit/10.0)*10.0; i = 48.0 - 32.0 + digit; uRow = floor(i / 10.0); uCol = i - 10.0 * uRow; fragColor = texture2D( s_texture, uv / devisor * 2.0 + vec2((uCol-0.0) / devisor, uRow / devisor) ); } else { fragColor = vec4(0.0, 0.0, 0.0, 0.0); } } else { fragColor = vec4(0.0, 0.0, 0.0, 0.0); } gl_FragColor = fragColor; }
上記コードを作品の質感アトラスが数0で始の7カラム、2列目フォントのアトラス(組織).
参照 https://www.shadertoy.com/view/Xl23Dw デモンストレーション実施(間違った質感が