ページ 1 / 1
OpenGl ESでの文字列表示
Posted: 2010年8月16日(月) 20:49
by 蓮
OpenGl ESでの文字列表示を行いたいです。
今までPNGファイルなどに下手でデータを書いていたのですが
漢字を使いたくなり文字列を表示する関数を作りたいです。
色々と調べてみたのですがESにはそのような関数がなく
テクスチャに文字列を表示させて描画するのが方法の一つということまでわかりました。
しかし下記のサイト等をみながら実装しようとしているのですがエラーが取れません。
http://objective-audio.jp/2008/12/post-11.html
コメント欄に
memsetの前にbitmapBufferのメモリ確保が要ります。と書いてあるのですがこれもよくわかりません・・・。
どのようにすれば文字列を表示できるでしょうか?
これ以外の方法でも文字列が表示されれば問題ないです。
お手数お掛け致しますがご教授頂けますと助かります。
Re:OpenGl ESでの文字列表示
Posted: 2010年8月17日(火) 16:37
by 蓮
すみません・・・誤字がございました。
>>今までPNGファイルなどに下手でデータを書いていたのですが
↓
今までPNGファイルなどにベタでデータを書いていたのですが
OpenGL ESでは文字列の描画は無理なのでしょうか?
Re:OpenGl ESでの文字列表示
Posted: 2010年8月17日(火) 23:53
by Justy
>memsetの前にbitmapBufferのメモリ確保が要ります。と書いてあるのですがこれもよくわかりません・
bitmapBufferはただのポインタなのでテクスチャデータ(横×縦×4バイト)を格納するサイズ分
メモリを確保しなければなりません。
普通に mallocでアロケートしてあげてください。
>これ以外の方法
似たようなものですが、こっちも参考にしてみてはどうでしょうか?
http://blog.livedoor.jp/abars/archives/51877534.html
こちらのコードでは mallocもコンテキストの作成も出てきます。
Re:OpenGl ESでの文字列表示
Posted: 2010年8月18日(水) 03:38
by 蓮
Justy様
いつもご回答ありがとう御座います。
本当に助かっております。
アロケートは下記の様な感じで大丈夫なのでしょうか?
又、生成したテクスチャの表示がうまく出来ません・・・。
どのようにすれば正しく表示されるのでしょうか?
bitmapBuffer = (Byte *)malloc(imageRect.size.width * imageRect.size.height * 4);
memset(bitmapBuffer, 0, imageRect.size.width * imageRect.size.height * 4);
CGContextSetRGBFillColor (bitmapContext, 0.0, 0.0, 0.0, 1.0);
CGContextFillRect (bitmapContext, imageRect);
UIGraphicsPushContext(bitmapContext);
UIFont *tFont = [UIFont systemFontOfSize:40];
[[UIColor whiteColo[/url] set];
[@"Test String 1234567890" drawAtPoint:CGPointMake(0, 0) withFont:tFont];
[@"日本語もOK!" drawAtPoint:CGPointMake(0, 44) withFont:tFont];
UIGraphicsPopContext();
CGImageRef image = CGBitmapContextCreateImage(bitmapContext);
//ここでテクスチャに描画する
// glTexImage2D(GL_TEXTURE_2D,0,GL_RGB, imageRect.width,imageRect.height,0, GL_RGB,GL_UNSIGNED_BYTE,image);
CGImageRelease(image);
Re:OpenGl ESでの文字列表示
Posted: 2010年8月18日(水) 04:16
by めるぽん
Justy さんが示したページを読む限り、glTexImage2D する前にちゃんと glBindTexture は呼ぶ必要があって、GL_RGB ではなく、それぞれ GL_RGBA, GL_BGRA にする必要がありそうですね。
あと、そのコードからは読めないのですけど、CGBitmapContextCreate する際にちゃんと bitmapBuffer を渡しているのでしょうか。bitmapBuffer と CGContextRef をちゃんと関連付けないとダメです。
うろ覚えですが、CGBitmapContextCreate の第一引数を NULL にすれば、内部で必要な量だけのバッファを勝手に確保してくれた気がするので、
// コンテキストの生成
CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
CGContextRef bitmapContext = CGBitmapContextCreate(NULL,
imageRect.size.width, imageRect.size.height, 8,
imageRect.size.width * 4, colorSpace, kCGImageAlphaPremultipliedLast);
CGColorSpaceRelease(colorSpace);
// 文字列を描画
UIGraphicsPushContext(bitmapContext);
[[UIColor whiteColo[/url] set];
[@"Test String 1234567890" drawAtPoint:CGPointMake(0, 0) withFont:tFont];
[@"日本語もOK!" drawAtPoint:CGPointMake(0, 44) withFont:tFont];
UIGraphicsPopContext();
// イメージを取り出す
CGImageRef image = CGBitmapContextCreateImage(bitmapContext);
CGContextRelease(bitmapContext);
// テクスチャの生成
int texture;
glGenTextures(1, &texture);
glBindTexture(GL_TEXTURE_2D, texture);
glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA,
imageRect.width, imageRect.height, 0, GL_BGRA, GL_UNSIGNED_BYTE, image);
CGImageRelease(image);
return texture;
とかやれば、malloc しなくても動いたりしませんかね?
もし NULL を指定してもダメなら、malloc したポインタを NULL の部分に与えてやればよさそうです。

Re:OpenGl ESでの文字列表示
Posted: 2010年8月18日(水) 15:32
by 蓮
皆様ご回答ありがとうございます。
エラーはなく動くようになりました。
しかし描画すると白いテクスチャが表示されるだけでした・・・。
描画用の関数が行けないのでしょうか?
※画像を表示するようです。
またOpenGLなのですが座標系を変更しております。
(縦 320 横 480)
Re:OpenGl ESでの文字列表示
Posted: 2010年8月19日(木) 09:27
by 蓮
上のソースから色々と弄っては見たのですが
白いテクスチャから変わりません・・・。
描画用の関数が原因なのでしょうか?
Re:OpenGl ESでの文字列表示
Posted: 2010年8月19日(木) 23:19
by Justy
テクスチャサイズは縦横それぞれ幾つに設定していますか?
あと、これは白くなる原因ではないですが、多分 glTexImage2Dの GL_BGRAは GL_RGBAにしないとダメなんじゃないかと思います。
Re:OpenGl ESでの文字列表示
Posted: 2010年8月20日(金) 03:31
by 蓮
ご回答ありがとうございます。
test.imageSize.width = 128;
test.imageSize.height = 128;
と書いてある部分がテクスチャのサイズになります。
これがイケないのでしょうか?
Re:OpenGl ESでの文字列表示
Posted: 2010年8月20日(金) 20:17
by Justy
>これがイケないのでしょうか?
あー、そこかもしれません。
コード上では loadFontした後に設定していますが、テクスチャは loadFont内で
test.imageSize.widthなどを参照して生成しますので、loadFontよりも前に背ってしないと
うまく動かないかと。
とりあえず
[color=#d0d0ff" face="monospace]
test.imageSize.width = 128;
test.imageSize.height = 128;
test.texture = loadFont();
[/color]
にして試して貰えますか?
Re:OpenGl ESでの文字列表示
Posted: 2010年8月20日(金) 21:12
by 蓮
何度も何度もご回答ありがとうございます・・・。
そのようにしてみたのですが変化はありませんでした。
私のソースの読む力がないので何を行っているのかわからないのですが
test.imageSize.widthを参照しているのでしょうか?
関数内で作りだしたものを参照しているのかと・・・
もしかして引数を指定する仕様にしないと駄目なのでしょうか?
プロジェクトを置かせて頂きます。
PASS:ren
http://www1.axfc.net/uploader/Si/so/82488
Re:OpenGl ESでの文字列表示
Posted: 2010年8月20日(金) 22:55
by Justy
>test.imageSize.widthを参照しているのでしょうか?
あ、すみません。imageRect.size.width/heightの方でした。
こちらの値がテクスチャ生成時のサイズになりますので、この値をどうセットしているかを
知りたかったのです。
しかし全ソースがあると話が早いですね。
というわけで直してみました。
サイズの問題、フィルタ関連、あと天地を逆に等、細かな点も修正してあります。
これで表示されると思います。お試し下さい。
Re:OpenGl ESでの文字列表示
Posted: 2010年8月23日(月) 03:18
by 蓮
Justy様
ご回答ありがとうございます。
無事に描画出来ました!!
指定した位置に描画したいのですが正常に表示できないです。
自分なりにカスタマイズしているのですが上手くいかないので
再度質問してしまうかもしれません