[iPhone]OpenGLESでの文字列描画

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
Hi_L
記事: 7
登録日時: 12年前

[iPhone]OpenGLESでの文字列描画

#1

投稿記事 by Hi_L » 12年前

初めまして。初投稿です。

現在iPhoneアプリを作っていて、OpenGLESで文字列描画をしたいと思っています。
googleで検索すると、以下のようなトピックを見つけました。

http://dixq.net/forum/viewtopic.php?f=3&t=11112

これを参考に関数を作っていったのですが、
やはり白いテクスチャが表示されるだけでうまくいきません。
どうにかして文字列を描画できるようにしたいです。

現在のコードはこうなっています。

コード:

GLuint LoadString(NSString* String, float Width, float FontSize){

    GLubyte *imageData = (GLubyte*)malloc(Width*Width*4);
    CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
    CGContextRef bitmapContext = CGBitmapContextCreate(imageData, Width, Width, 8, Width*4, colorSpace, kCGImageAlphaPremultipliedLast); //文字列用のコンテキスト
    
    //コンテキストの生成
    CGContextSetRGBFillColor(bitmapContext, 0.0, 0.0, 0.0, 1.0);
    CGContextFillRect(bitmapContext, CGRectMake(0, 0, Width, Width));
    UIGraphicsPushContext(bitmapContext);
    
    //文字列の描画
    UIFont *tFont = [UIFont systemFontOfSize:FontSize];
    [[UIColor whiteColor] set];
    [String drawAtPoint:CGPointMake(0, 0) withFont:tFont];
    
    UIGraphicsPopContext();
    
    //イメージを取り出す
    CGImageRef image = CGBitmapContextCreateImage(bitmapContext);
    CGContextRelease(bitmapContext);
    
    //テクスチャの生成
    GLuint Texture;    
    glGenTextures(1, &Texture);
	glBindTexture(GL_TEXTURE_2D, Texture);
	glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, CGImageGetWidth(image), CGImageGetHeight(image), 0, GL_RGBA, GL_UNSIGNED_BYTE, image);
    
    CGImageRelease(image);
    
    return Texture;
}

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

Re: [iPhone]OpenGLESでの文字列描画

#2

投稿記事 by ISLe » 12年前

テクスチャをバインドしているときに
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
を入れてみてください。
26行目と27行目のあいだ推奨。

Hi_L
記事: 7
登録日時: 12年前

Re: [iPhone]OpenGLESでの文字列描画

#3

投稿記事 by Hi_L » 12年前

返信ありがとうございます。

試してみると文字は描画されず、
ノイズのようなものが描画されました。

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

Re: [iPhone]OpenGLESでの文字列描画

#4

投稿記事 by ISLe » 12年前

バッファ(image)内の画素の並びはBGRAの順になるそうなので、glTexImage2Dの7番目の引数にGL_BGRAを指定すれば良いかもしれません。
OpenGL ESではGL_BGRAが使えないかもしれません。
その場合は、GL_RGBAに合わせてバッファ(image)の中身を書き換えてください。

#kCGImageAlphaLastはCGBitmapContextCreateで指定できないらしいですね。

Hi_L
記事: 7
登録日時: 12年前

Re: [iPhone]OpenGLESでの文字列描画

#5

投稿記事 by Hi_L » 12年前

引数をGL_BGRAにかえてみましたが、
ノイズの色が変わるだけでした...

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

Re: [iPhone]OpenGLESでの文字列描画

#6

投稿記事 by ISLe » 12年前

あとは画素の並びの問題だけだと思うので、RGBAを入れ替えて組み合わせを検証するしかないですかね。

申し訳ないですがiPhoneの開発はしたことがないのでこれ以上は分かりません。

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

Re: [iPhone]OpenGLESでの文字列描画

#7

投稿記事 by ISLe » 12年前

glTexImage2Dの9番目の引数にCGImageRefを直接渡してますけど、これって大丈夫なんでしょうか。

CGImageRefからピクセルデータにアクセスするには以下のようにするというのを見付けたのですが。
CFDataRef inputDataRef = CGDataProviderCopyData(CGImageGetDataProvider(inputImageRef));
unsigned char *pixelData = (unsigned char*) CFDataGetBytePtr(inputDataRef);

Hi_L
記事: 7
登録日時: 12年前

Re: [iPhone]OpenGLESでの文字列描画

#8

投稿記事 by Hi_L » 12年前

ありがとうございます!
ちゃんと文字列が描画されました!

コード:

GLuint LoadString(NSString* String, float Width, float FontSize){
    GLubyte *imageData = (GLubyte*)malloc(Width*Width*4);
    CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
    CGContextRef bitmapContext = CGBitmapContextCreate(imageData, Width, Width, 8, Width*4, colorSpace, kCGImageAlphaPremultipliedLast); //文字列用のコンテキスト
    
    //コンテキストの生成
    CGContextSetRGBFillColor(bitmapContext, 0.0, 0.0, 0.0, 0.0);
    CGContextFillRect(bitmapContext, CGRectMake(0, 0, Width, Width));

    CGContextTranslateCTM(bitmapContext, 0, Width);
    CGContextScaleCTM(bitmapContext, 1.0, -1.0);

    UIGraphicsPushContext(bitmapContext);
    
    //文字列の描画
    UIFont *tFont = [UIFont systemFontOfSize:FontSize];
    [[UIColor whiteColor] set];
    [String drawAtPoint:CGPointMake(0, 0) withFont:tFont];
    
    UIGraphicsPopContext();
    
    //イメージを取り出す
    CGImageRef image  = CGBitmapContextCreateImage(bitmapContext);
    CFDataRef inputDataRef = CGDataProviderCopyData(CGImageGetDataProvider(image));
    unsigned char *pixelData = (unsigned char*)CFDataGetBytePtr(inputDataRef);
    CGContextRelease(bitmapContext);
    
    //テクスチャの生成
    GLuint Texture;    
    glGenTextures(1, &Texture);
	glBindTexture(GL_TEXTURE_2D, Texture);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
	glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, CGImageGetWidth(image), CGImageGetHeight(image), 0, GL_BGRA, GL_UNSIGNED_BYTE, pixelData);
    
    CGImageRelease(image);
    CFRelease(inputDataRef);
    
    return Texture;
}

閉鎖

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