OpenGL ESでの文字の表示

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

OpenGL ESでの文字の表示

#1

投稿記事 by 紅葉 » 13年前

こちらでお聞きしてよいか、わからないのですが質問させてください。

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での文字の表示

#2

投稿記事 by 紅葉 » 13年前

度々、失礼します(汗)
環境が特殊なのでお分かりになるかたはいないですよね•••。

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

本当に申し訳ないです。

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

Re: OpenGL ESでの文字の表示

#3

投稿記事 by ISLe » 13年前

Objective-Cは分からないので当てずっぽうですが。
リンク先の記事にある、ビットマップコンテキストをいったん塗り潰す処理が必要なのではないでしょうか?

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

紅葉

Re: OpenGL ESでの文字の表示

#4

投稿記事 by 紅葉 » 13年前

アドバイスありがとうございます!
聞ける人がいないので本当に助かりました。

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での文字の表示

#5

投稿記事 by 紅葉 » 13年前

解決できたかもしれません!
ご助言ありがとうございました。

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

Re: OpenGL ESでの文字の表示

#6

投稿記事 by ISLe » 13年前

フォーラムルールに従って、最終的に動作したコードを貼っていただければと存じます。

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

閉鎖

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