ページ 11

OpenGL ESでの文字の表示

Posted: 2012年7月21日(土) 18:05
by 紅葉
こちらでお聞きしてよいか、わからないのですが質問させてください。

OpenGlにて文字列を表示したいです。
そこでテクスチャに文字列を貼って、描画しようとしております。
参考URLを見ながら実装しているのですが、
描画すると白いテクスチャが表示されるだけどなってしまいます。

何とかして文字列を表示したいのですが
修正箇所などお分かりの方はおりませんでしょうか。

参考URL
http://objective-audio.jp/2008/12/post-11.html

コード:


CGRect imageRect; //文字列用の画像の大きさ
CGContextRef bitmapContext; //文字列用のコンテキスト
Byte *bitmapBuffer; //コンテキストのバッファ

GLuint loadFont(){
	// コンテキストの生成
	imageRect.size.width = 128;
	imageRect.size.height = 128;
	CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
	CGContextRef bitmapContext = CGBitmapContextCreate(NULL,
													   imageRect.size.width, imageRect.size.height, 8,
													   imageRect.size.width * 4, colorSpace, kCGImageAlphaPremultipliedLast);
	CGColorSpaceRelease(colorSpace);
	
	// 文字列を描画
	UIGraphicsPushContext(bitmapContext);
	UIFont *tFont = [UIFont systemFontOfSize:40];
	[[UIColor blackColor] set];
	[@"Test String 1234567890" drawAtPoint:CGPointMake(0, 0) withFont:tFont];
	[@"日本語もOK!" drawAtPoint:CGPointMake(0, 44) 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,
				 imageRect.size.width, imageRect.size.height, 0, GL_RGBA, GL_UNSIGNED_BYTE, image);
	CGImageRelease(image);
	return texture;
	 
}

Re: OpenGL ESでの文字の表示

Posted: 2012年7月24日(火) 03:56
by 紅葉
度々、失礼します(汗)
環境が特殊なのでお分かりになるかたはいないですよね•••。

どうしても実装したいのです。
お分かりにならなくても構わないので参考になるかもしれない
情報を少しでも頂けないでしょうか?

本当に申し訳ないです。

Re: OpenGL ESでの文字の表示

Posted: 2012年7月24日(火) 04:39
by ISLe
Objective-Cは分からないので当てずっぽうですが。
リンク先の記事にある、ビットマップコンテキストをいったん塗り潰す処理が必要なのではないでしょうか?

あと、テクスチャにはkCGImageAlphaPremultipliedLastではなくてkCGImageAlphaLastが相応しい気がします。

Re: OpenGL ESでの文字の表示

Posted: 2012年7月25日(水) 11:14
by 紅葉
アドバイスありがとうございます!
聞ける人がいないので本当に助かりました。

CGContextClearRectで塗りつぶしてみたのですがうまく表示できませんでした。
(白いでテクスチャのまま)
何の処理も関数に書かずにGLuintを返すと同じ状態になるので
うまく文字列のテクスチャを貼れていないのかもしれません。

>>あと、テクスチャにはkCGImageAlphaPremultipliedLastではなくてkCGImageAlphaLastが相応しい気がします。
違いがわからなかったので色々と調べてみました。
下記のようなことも見つかったのですが今回は関係ないのでしょうか。
http://ameblo.jp/xcc/entry-10455818191.html

下記は現在のソースです。

コード:

GLuint loadFont(){
    // コンテキストの生成
    imageRect.size.width = 128;
    imageRect.size.height = 128;
	//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);
    CGContextClearRect( bitmapContext, imageRect );
	
	UIFont *tFont = [UIFont systemFontOfSize:40];
	[[UIColor whiteColor] set];
	[@"Test String 1234567890" drawAtPoint:CGPointMake(0, 0) withFont:tFont];
	[@"日本語もOK!" drawAtPoint:CGPointMake(0, 44) withFont:tFont];
    
	UIGraphicsPopContext();
    
	CGImageRef image = CGBitmapContextCreateImage(bitmapContext);

	//ここでテクスチャに描画する
    
    // テクスチャの生成imageRect.size.width
    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);
	
    // テクスチャの設定を行う
	/*
    glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
    glEnable(GL_TEXTURE_2D);
    glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
    glEnable(GL_BLEND);
	*/
    //CGImageRelease(image);
    return texture;
	
}

Re: OpenGL ESでの文字の表示

Posted: 2012年7月25日(水) 16:49
by 紅葉
解決できたかもしれません!
ご助言ありがとうございました。

Re: OpenGL ESでの文字の表示

Posted: 2012年7月25日(水) 18:05
by ISLe
フォーラムルールに従って、最終的に動作したコードを貼っていただければと存じます。

CGContextFillRectで塗り潰したあとに、CGContextClearRectで背景色(おそらく不透明の白)で再び塗り潰してしまっているのではないでしょうか。
何も描画しなくても白いのは、ビットマップコンテキストを作成した時点で、デフォルトの背景色(おそらく不透明の白)で塗り潰される仕様なのかもしれません。