OpenGLを使ったテクスチャの特定色の透過

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

OpenGLを使ったテクスチャの特定色の透過

#1

投稿記事 by bonbo » 13年前

早速ですが質問させていただきます。
タイトルの通りなのですがDirectXを使っていた時のようにOpenGLでも特定色を透過する機能があるのかと思い
いろいろ調べたのですが、どうも見つからなかったので質問させていただきました。
どのようにして透過したらよいのでしょうか。
(一応
http://www.impressjapan.jp/support/aftercare/2808
にあるプロジェクトにそれっぽいことができているのがあったのですが、テキストの方にはアルファブレンディングとして
ひとくくりにされており、書いてありませんでした。)
よろしくお願いします。

環境はXcode4.4ですよろしくお願いします。

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

Re: OpenGLを使ったテクスチャの特定色の透過

#2

投稿記事 by ISLe » 13年前

そもそもOpenGL自体には特定の形式の画像ファイルを読み込む機能がありませんから、画像ファイルから画素を読み込む際に、特定の色であれば透過するようにα値を設定すれば良いのでは。

透過無しで画像を表示することはできているのでしょうか。

bonbo

Re: OpenGLを使ったテクスチャの特定色の透過

#3

投稿記事 by bonbo » 13年前

>Isleさん
ありがとうございます。
>透過無しで画像を表示することはできているのでしょうか。
はい。透過pngなら透過するところまではわかっています。…といっても上記サイトのプロジェクトのコードをマネして書いたものなのですが…

コード:

CGImageRef image=[UIImage imageNamed: filename].CGImage;
if(!image)
{
    NSLog(@"image false");
        return -1;
    }
    size_t width=CGImageGetWidth(image);
    size_t height=CGImageGetHeight(image);
    GLubyte* imageData=(GLubyte*)malloc(width*height*4);
    CGContextDrawImage(imageContext,CGRectMake(0,0,(CGFloat)width,(CGFloat)height),image);
    CGContextRelease(imageCongext);

	glGenTextures(1, &texture);
	glBindTexture(GL_TEXTURE_2D, texture);
	glTexParameteri(GL_TEXTURE_2D, GL_GENERATE_MIPMAP, GL_TRUE);
	glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
	glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST_MIPMAP_NEAREST);
	glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, width, height, 0, GL_RGBA, GL_UNSIGNED_BYTE, imageData);
	free(imageData);
//textureにテクスチャの情報が入った。
次に描画

コード:

int red=255,green=255,blue=255,alpha=255;
   const GLubyte squareColors[] = {
        red, green, blue ,alpha,
        red, green, blue ,alpha,
	red, green, blue ,alpha,
	red, green, blue ,alpha,
    };//各頂点の色
	const GLfloat texCoords[] = {
		left,				bottom,
		right,	bottom,
		left,				top,
		right,	top,
	};//テクスチャの頂点
	//テクスチャ機能を有効にし、描画に使用するテクスチャを指定します
	glEnable(GL_TEXTURE_2D);
	glBindTexture(GL_TEXTURE_2D, texture);
	glVertexPointer(2, GL_FLOAT, 0, squareVertices);
    glEnableClientState(GL_VERTEX_ARRAY);
    glColorPointer(4, GL_UNSIGNED_BYTE, 0, squareColors);
    glEnableClientState(GL_COLOR_ARRAY);
	glTexCoordPointer(2, GL_FLOAT, 0, texCoords);
	glEnableClientState(GL_TEXTURE_COORD_ARRAY);
	
    glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
	
	//テクスチャ機能を無効にします
	glDisableClientState(GL_TEXTURE_COORD_ARRAY);
	glDisable(GL_TEXTURE_2D);

抜けがあったらすみません。
もちろん関数化してあり、描画の前後には
glEnable(GL_BLEND)とglDisable(GL_BLEND)があります。


>画像ファイルから画素を読み込む際に、特定の色であれば透過するようにα値を設定すれば良い

openGLに関しては文献が古かったり少なかったりで調べきれていません…申し訳ないです。

今持っているテキストには画素の読み込みについては、おおざっぱにしか書かれていないので正直よくわかっていません。

何か関数を追加する必要があるのでしょうか。

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

Re: OpenGLを使ったテクスチャの特定色の透過

#4

投稿記事 by ISLe » 13年前

bonbo さんが書きました:>画像ファイルから画素を読み込む際に、特定の色であれば透過するようにα値を設定すれば良い
openGLに関しては文献が古かったり少なかったりで調べきれていません…申し訳ないです。
今持っているテキストには画素の読み込みについては、おおざっぱにしか書かれていないので正直よくわかっていません。
いえ、先に書いたようにOpenGLに画像を読み込む機能は無いのです。
処理系に応じた画像を読み込む処理を実装しているはずなので、そこで画素を操作する必要があるわけです。

ロードしているコードにおいて、gl関数を呼び出してテクスチャを作成する段階でimageDataが指すメモリ領域には画素がRGBAのバイト並びで入っています。
なのでその直前でα値を書き換えます。

コード:

int i;
for (i=0; i<width*height; i++) {
    int r = imageData[i*4+0]; /* R要素 */
    int g = imageData[i*4+1]; /* G要素 */
    int b = imageData[i*4+2]; /* B要素 */
    if (r == ?? && g == ?? && b == ??) { /* ??に値を入れて任意の色を特定 */
        imageData[i*4+3] = 0; /* 透過する */
    } else {
        imageData[i*4+3] = 255; /* 透過しない */
    }
}
こんな感じですが、Objective-Cは触ったことがないのでCのコードです。
透過する/しないのα値は逆かもしれません。

bonbo

Re: OpenGLを使ったテクスチャの特定色の透過

#5

投稿記事 by bonbo » 13年前

>ISLeさん
できました。ありがとうございます。
実は(ピクセルの数*4)というコードも、なぜこうなるのかあいまいにしたまま進んでいたのでとても助かりました。

本当にありがとうございました。

閉鎖

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