早速ですが質問させていただきます。
タイトルの通りなのですがDirectXを使っていた時のようにOpenGLでも特定色を透過する機能があるのかと思い
いろいろ調べたのですが、どうも見つからなかったので質問させていただきました。
どのようにして透過したらよいのでしょうか。
(一応
http://www.impressjapan.jp/support/aftercare/2808
にあるプロジェクトにそれっぽいことができているのがあったのですが、テキストの方にはアルファブレンディングとして
ひとくくりにされており、書いてありませんでした。)
よろしくお願いします。
環境はXcode4.4ですよろしくお願いします。
OpenGLを使ったテクスチャの特定色の透過
Re: OpenGLを使ったテクスチャの特定色の透過
そもそもOpenGL自体には特定の形式の画像ファイルを読み込む機能がありませんから、画像ファイルから画素を読み込む際に、特定の色であれば透過するようにα値を設定すれば良いのでは。
透過無しで画像を表示することはできているのでしょうか。
透過無しで画像を表示することはできているのでしょうか。
-
bonbo
Re: OpenGLを使ったテクスチャの特定色の透過
>Isleさん
ありがとうございます。
>透過無しで画像を表示することはできているのでしょうか。
はい。透過pngなら透過するところまではわかっています。…といっても上記サイトのプロジェクトのコードをマネして書いたものなのですが…
次に描画
抜けがあったらすみません。
もちろん関数化してあり、描画の前後には
glEnable(GL_BLEND)とglDisable(GL_BLEND)があります。
>画像ファイルから画素を読み込む際に、特定の色であれば透過するようにα値を設定すれば良い
openGLに関しては文献が古かったり少なかったりで調べきれていません…申し訳ないです。
今持っているテキストには画素の読み込みについては、おおざっぱにしか書かれていないので正直よくわかっていません。
何か関数を追加する必要があるのでしょうか。
ありがとうございます。
>透過無しで画像を表示することはできているのでしょうか。
はい。透過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に関しては文献が古かったり少なかったりで調べきれていません…申し訳ないです。
今持っているテキストには画素の読み込みについては、おおざっぱにしか書かれていないので正直よくわかっていません。
何か関数を追加する必要があるのでしょうか。
Re: OpenGLを使ったテクスチャの特定色の透過
いえ、先に書いたようにOpenGLに画像を読み込む機能は無いのです。bonbo さんが書きました:>画像ファイルから画素を読み込む際に、特定の色であれば透過するようにα値を設定すれば良い
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; /* 透過しない */
}
}
透過する/しないのα値は逆かもしれません。
-
bonbo
Re: OpenGLを使ったテクスチャの特定色の透過
>ISLeさん
できました。ありがとうございます。
実は(ピクセルの数*4)というコードも、なぜこうなるのかあいまいにしたまま進んでいたのでとても助かりました。
本当にありがとうございました。
できました。ありがとうございます。
実は(ピクセルの数*4)というコードも、なぜこうなるのかあいまいにしたまま進んでいたのでとても助かりました。
本当にありがとうございました。