glTexImage2Dによる文字列描画

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
milk-teria

glTexImage2Dによる文字列描画

#1

投稿記事 by milk-teria » 14年前

FreeType2で生成した文字情報をOpenGL ES 1.1を使用して描画しようとしています。
FreeType2による文字列データ(ビットマップ情報)は以下の通りで、256階調のグレースケールになっています。
(「a」という文字を生成)

0000003b8ac0e5f8fcedc26e07000000
0020c9ffffffffffffffffffcc0a0000
0053ffffffffffffffffffffff800000
0002d0fff0a97e6e76cbffffffd00000
0000144a0a0000000040fffffff40000
00000000000000000038ffffffff0000
000000001467abd5effcffffffff0000
0000027cf3ffffffffffffffffff0000
00009effffffffffffffffffffff0000
004cffffffffffc48790ffffffff0000
00b3fffffff240000038ffffffff0000
00e9ffffff7700000038ffffffff0000
00fcffffff3f00000053ffffffff0600
00f0ffffff59000008cbffffffff1600
00bbffffffe0767ed5ffffffffff3600
0050ffffffffffffffffffffffff7000
000093fffffffffffffd7afaffffd500
00000051bbeefae4a5320077f4ffbe00

width=256、height=64の指定で、上記情報以外は全て0x00で埋まっています。
上記情報を以下の処理で描画したところ、赤で塗り潰された、width=256、height=64の四角が描画されてしまいます。
(imageに上記情報が入っています)

↓プログラム
float varray[][3] =
{
{-w, -h, 0},
{ w, -h, 0},
{-w, h, 0},
{ w, h, 0},
};

float tarray[][2] =
{
{ 0.0f, 1.0f},
{ 1.0f, 1.0f},
{ 0.0f, 0.0f},
{ 1.0f, 0.0f},
};

glGenTextures (1, (GLuint *) &texture_id);
glBindTexture (GL_TEXTURE_2D, texture_id);
glTexParameterf (GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
glTexParameterf (GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
glTexParameterf (GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameterf (GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
glTexImage2D (GL_TEXTURE_2D, 0, GL_LUMINANCE, 256, 64, 0, GL_LUMINANCE, GL_UNSIGNED_BYTE, image);
glColor4f (FLOAT_COLOR (255),FLOAT_COLOR (0),FLOAT_COLOR (0),FLOAT_COLOR (255));
glBindTexture (GL_TEXTURE_2D, texture_id);
glVertexPointer (3, GL_FLOAT, 0, varray);
glTexCoordPointer(2, GL_FLOAT, 0, tarray);
glDrawArrays (GL_TRIANGLE_STRIP, 0, 4);

↑プログラム

0x00で埋まっているところは透過され赤色で「a」が描画されると思っていたのですが、これは間違っているのでしょうか?
どうしたら、「a」が描画されるようになるのでしょうか?
当方、OpenGL ES 1.1を使用するのは今回が初めての初心者です。
何卒ご教示のほどよろしくお願い致します。
情報不足等ありましたら、申し訳ありません。

ISLe
記事: 2650
登録日時: 15年前
連絡を取る:

Re: glTexImage2Dによる文字列描画

#2

投稿記事 by ISLe » 14年前

OpenGL ESの環境がすぐに用意できなかったのでOpenGL+GLUTでサンプル作ってみました。
だいたい同じだと思いますが参考になるでしょうか。

コード:

#include <GL/glut.h>

GLuint texture_id[2];

GLubyte image[] = {
	0x00,0x00,0x00,0x3b,0x8a,0xc0,0xe5,0xf8,0xfc,0xed,0xc2,0x6e,0x07,0x00,0x00,0x00,
	0x00,0x20,0xc9,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xcc,0x0a,0x00,0x00,
	0x00,0x53,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x80,0x00,0x00,
	0x00,0x02,0xd0,0xff,0xf0,0xa9,0x7e,0x6e,0x76,0xcb,0xff,0xff,0xff,0xd0,0x00,0x00,
	0x00,0x00,0x14,0x4a,0x0a,0x00,0x00,0x00,0x00,0x40,0xff,0xff,0xff,0xf4,0x00,0x00,
	0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x38,0xff,0xff,0xff,0xff,0x00,0x00,
	0x00,0x00,0x00,0x00,0x14,0x67,0xab,0xd5,0xef,0xfc,0xff,0xff,0xff,0xff,0x00,0x00,
	0x00,0x00,0x02,0x7c,0xf3,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0x00,
	0x00,0x00,0x9e,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x00,0x00,
	0x00,0x4c,0xff,0xff,0xff,0xff,0xff,0xc4,0x87,0x90,0xff,0xff,0xff,0xff,0x00,0x00,
	0x00,0xb3,0xff,0xff,0xff,0xf2,0x40,0x00,0x00,0x38,0xff,0xff,0xff,0xff,0x00,0x00,
	0x00,0xe9,0xff,0xff,0xff,0x77,0x00,0x00,0x00,0x38,0xff,0xff,0xff,0xff,0x00,0x00,
	0x00,0xfc,0xff,0xff,0xff,0x3f,0x00,0x00,0x00,0x53,0xff,0xff,0xff,0xff,0x06,0x00,
	0x00,0xf0,0xff,0xff,0xff,0x59,0x00,0x00,0x08,0xcb,0xff,0xff,0xff,0xff,0x16,0x00,
	0x00,0xbb,0xff,0xff,0xff,0xe0,0x76,0x7e,0xd5,0xff,0xff,0xff,0xff,0xff,0x36,0x00,
	0x00,0x50,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0x70,0x00,
	0x00,0x00,0x93,0xff,0xff,0xff,0xff,0xff,0xff,0xfd,0x7a,0xfa,0xff,0xff,0xd5,0x00,
	0x00,0x00,0x00,0x51,0xbb,0xee,0xfa,0xe4,0xa5,0x32,0x00,0x77,0xf4,0xff,0xbe,0x00,
	0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
	0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
	0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
	0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
	0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
	0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
	0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
	0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
	0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
	0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
	0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
	0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
	0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
	0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
};

void disp(void)
{
	GLfloat varray[][2] =
	{
		{ -0.4f,  0.4f },
		{  0.4f,  0.4f },
		{ -0.4f, -0.4f },
		{  0.4f, -0.4f },
	};

	GLfloat tarray[][2] =
	{
		{ 0.0f, 0.0f },
		{ 1.0f, 0.0f },
		{ 0.0f, 1.0f },
		{ 1.0f, 1.0f },
	};

	glClear(GL_COLOR_BUFFER_BIT);
	glColor4f(1.0f, 0.0f, 0.0f, 1.0f);

	glTranslatef(-0.5f, 0.5f, 0.0f);
	for (int i=0; i<2; i++) {
		glBindTexture(GL_TEXTURE_2D, texture_id[i]);

		glEnableClientState(GL_VERTEX_ARRAY);
		glEnableClientState(GL_TEXTURE_COORD_ARRAY);
		glVertexPointer(2, GL_FLOAT, 0, varray);
		glTexCoordPointer(2, GL_FLOAT, 0, tarray);
		glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
		glDisableClientState(GL_VERTEX_ARRAY);
		glDisableClientState(GL_TEXTURE_COORD_ARRAY);

		glTranslatef(1.0f, -1.0f, 0.0f);
	}

	glFlush();
}

void init(void)
{
	glClearColor(0.0, 0.0, 1.0, 1.0);

	glEnable(GL_TEXTURE_2D);
	glGenTextures(2, texture_id);

	// 単一の輝度
	glBindTexture(GL_TEXTURE_2D, texture_id[0]);
	glTexImage2D(GL_TEXTURE_2D, 0, GL_LUMINANCE, 16, 18, 0, GL_LUMINANCE, GL_UNSIGNED_BYTE, image);
	glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
	glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);

	// 単一のアルファ値
	glBindTexture(GL_TEXTURE_2D, texture_id[1]);
	glTexImage2D(GL_TEXTURE_2D, 0, GL_ALPHA, 16, 18, 0, GL_ALPHA, GL_UNSIGNED_BYTE, image);
	glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
	glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);

	glEnable(GL_BLEND);
	glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
}

int main(int argc, char *argv[])
{
	glutInit(&argc, argv);
	glutInitWindowSize(400, 300);
	glutInitDisplayMode(GLUT_RGBA);
	glutCreateWindow("a");
	glutDisplayFunc(disp);
	init();
	glutMainLoop();
	return 0;
}
a.png
左上が輝度、右下がアルファ値
a.png (24.06 KiB) 閲覧数: 3460 回

milk-teria

Re: glTexImage2Dによる文字列描画

#3

投稿記事 by milk-teria » 14年前

ISLeさん、ありがとうございます。
早速試してみます。
結果はまたのちほど。

milk-teria

Re: glTexImage2Dによる文字列描画

#4

投稿記事 by milk-teria » 14年前

ISLeさん、おかげさまで描画させることでできました。

glTexImage2Dで指定するLUMINANCEではなくALPHAだったんですね。
大変助かりました。
どうもありがとうございました。

閉鎖

“C言語何でも質問掲示板” へ戻る