このサイトでは、分析、カスタマイズされたコンテンツ、および広告に Cookie を使用します。このサイトを引き続き閲覧すると、Cookie の使用に同意するものと見なされます。
Hi, Developers,
straightapps.com
作成日 October 17, 2018
トップページ > Android 開発トップ > OpenGLES での色指定

ここでは、OpenGLES で、色を指定する方法について、記録しています。

Windows では、ウィンドウのデバイス・コンテキスト(Window DC)を使用して画面を作成します。
Android ネイティブアプリでは、デバイスの画面サイズや解像度が多種多様であることなどから、 OpenGL というグラフィック・ライブラリの機能限定版(表現が不正確?)、 OpenGLES(
OpenGL ES) を使用して、画面を作成します。

それは、基本的には何もかも、Windows での画面描画と異なるものなので、少しづつ勉強するしかなさそうです。

ここでは、まずその基本的な、色指定の部分だけを記載しています。

このページ、および開発関連ページは、PC向けデザインとなっております。 画面サイズの小さいスマホでは、快適な表示が得られませんので、ご了承ください。
ご利用に際しては、必ずプライバシーポリシー(免責事項等)をご参照ください。
また、本サイトが初めての方は、まずこのページの注意事項をご覧ください。

OpenGLES 使用の準備

投稿 October 17, 2018

この部分は、他のすべての OpenGLES 関数を使うための共通の準備となります。

.NativeActivity のプロパティを見ると、「リンカー」の「入力」にある「ライブラリの依存ファイル」で、 GLESv1_CMEGL フォルダが追加指定されているようですが、 プロジェクトを新規作成したときに自動的に設定されているようです。 特に追加や書き換えは必要なさそうです。

インクルードファイルなどを見ると、関数の定義を含む gl.h が必要となりますが、 pch.h に以下の行があるので、こちらも特に何も考える必要はなさそうです。

#include <EGL/egl.h>
#include <GLES/gl.h>

どうやら、自動生成されたコードがすべてのセットアップを設定してくれているようです。

▲ページ先頭へ

画面描画の流れ

投稿 October 17, 2018

自動生成されたコードそのままの状態では、次のような流れで画面描画しています。

まずは、main.cpp の engine_init_display 関数で、「OpenGL ES と EGL の初期化」が行われています。 この関数は、APP_CMD_INIT_WINDOW メッセージを受領すると、呼び出されます。

描画は、main.cpp のメインループから呼び出される、engine_draw_frame 関数が行います。

自動生成されたコードでは、glClearColor 関数で塗りつぶし色を指定し、 glClear 関数で背景を指定色で塗りつぶします。 この段階では画面には反映されていなく、eglSwapBuffers 関数呼び出し時点で、画面に反映されるということです。
詳細は、次のセクションに記述しています。

	// 色で画面を塗りつぶします。
	glClearColor(((float)engine->state.x) / engine->width, engine->state.angle, ((float)engine->state.y) / engine->height, 1);
	glClear(GL_COLOR_BUFFER_BIT);

	eglSwapBuffers(engine->display, engine->surface);

engine_term_display メッセージを受領すると呼び出される engine_term_display 関数は、 このままでも良さそうです。

▲ページ先頭へ

OpenGLES での色指定

投稿 October 17, 2018

Windows では、32 ビットカラーの場合、R、G、B 要素とも 0〜255 の 256 段階で表現しています。 しかし OpenGLES では、R、G、B 要素を 0〜1 の間の小数で指定することになっています。

例えば、画面を指定の色でクリアする部分について、考えます。

	glClearColor(red, green, blue, 1.0);
	glClear(GL_COLOR_BUFFER_BIT);

glClearColor 関数は、OpenGLES のクリア色指定関数です。 red、green、blue は GLclampf 型の変数であり、 すなわち khronos_float_t 型であり、定義をたどると float 型と同じです。 次の glClear 関数で画面をクリアしていますが、そのときの色を指定している、ということになります。

なお、実際にはこれらの関数を実行しても、画面は更新されません。
メインループから呼び出す engine_draw_frame 関数の最後に自動生成されている、

eglSwapBuffers(engine->display, engine->surface);

が実行されて初めて、画面が更新されます。

最初から各要素を割合で指定するならそれでいいのですが(それはそれでわかりやすいと思いますが)、 Windows プログラマとしては、やはり RGB(255,255,255) の形式で指定したいのです。

今のところ背景のクリア以外には色を直接指定するケースは ありません ( アルファチャンネル指定があるので、メッセージ表示時に背景を暗くする処理に使える? ) が、 次のような関数で実現することにしました。
自分で使う関数なので、範囲外指定やエラーチェックはしていません。

void clear256(int red, int green, int blue)
{
	GLclampf red_f = (GLclampf)red / 255.0f;
	GLclampf green_f = (GLclampf)green / 255.0f;
	GLclampf blue_f = (GLclampf)blue / 255.0f;

	glClearColor(red, green, blue, 1.0);
	glClear(GL_COLOR_BUFFER_BIT);
}

単純に、0 が 0.0、255 が 1.0 になるように、255.0f で割っているだけです。
なお、glClearColor の第4引数はアルファ値で、1.0 だと不透明、すなわち塗りつぶし、です。

▲ページ先頭へ


関連トピックス
関連トピックはありません。


その他のおすすめ
おすすめ記事はありません。

JavaScriptが無効です
▲ページ先頭へ

© 2017-2018 StraightApps.com 無断転載を禁じます。No reproduction without permission.