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を使用するのは今回が初めての初心者です。
何卒ご教示のほどよろしくお願い致します。
情報不足等ありましたら、申し訳ありません。
glTexImage2Dによる文字列描画
Re: glTexImage2Dによる文字列描画
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;
}
-
milk-teria
Re: glTexImage2Dによる文字列描画
ISLeさん、おかげさまで描画させることでできました。
glTexImage2Dで指定するLUMINANCEではなくALPHAだったんですね。
大変助かりました。
どうもありがとうございました。
glTexImage2Dで指定するLUMINANCEではなくALPHAだったんですね。
大変助かりました。
どうもありがとうございました。