OpenGL ES1.1でのマスク処理について

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

OpenGL ES1.1でのマスク処理について

#1

投稿記事 by milk-teria » 14年前

OpenGL ES1.1を使用して文字列を描画するプログラムを組んでおります。
文字列を描画する手順としては、FreeType2を使用して256階調のグレースケール情報に文字列を展開
その文字列情報をテクスチャに変換し、描画するという処理にしています。
その際、glTexImage2Dの制約で幅、高さを2のべき乗にする処理を入れています。
展開された文字列情報が幅80、高さ40の場合、幅128、高さ64を指定しglTexImage2Dを実行。
文字列情報は拡大ではなく、広げた分を0x00とし透過されるようにしています。

描画領域のサイズ(下記プログラムのvallayの設定)を幅80、高さ40にすると、テクスチャが縮小表示されてしまうため、描画領域も幅128、高さ64としています。(幅80、高さ40の範囲外の部分は透過されるため問題ないと思っていました)
ところが、他のオブジェクトと重ねて描画したところ、透過されずにテキスト枠が描画されてしまいました。
本来の描画領域である幅80、高さ40の部分については透過されているのですが、はみ出た個所が透過されません。
オブジェクト間の透過処理については、こちらでは手が出せないところで組まれており、どうやら本来の描画領域に対してのみ透過処理をしているようなのです。
そこで、はみ出た領域については、マスクなどの処理を行うことで回避できないかと検討しているのですが、実現できるのか、実現出来る場合どのように実現するのかといったところが分らず困窮しているところです。

文字列描画のプログラムは以下となっています。(幅80、高さ40で描画)
文字列情報はimageに格納されています。

コード:

float varray[][3] =
{
{-64, -32, 0},
{ 64, -32, 0},
{-64, 32, 0},
{ 64, 32, 0},
};

float tarray[][2] =
{
{ 0.0f, 1.0f},
{ 1.0f, 1.0f},
{ 0.0f, 0.0f},
{ 1.0f, 0.0f},
};

glGenTextures (1, (GLuint *) &texture_id);
glBindTexture (GL_TEXTURE_2D, texture_id);
glTexParameterf (GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
glTexParameterf (GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
glTexParameterf (GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameterf (GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
glTexImage2D (GL_TEXTURE_2D, 0, GL_ALPHA, 128, 64, 0, GL_ALPHA, GL_UNSIGNED_BYTE, image);
glColor4f (FLOAT_COLOR (255),FLOAT_COLOR (0),FLOAT_COLOR (0),FLOAT_COLOR (255));
glBindTexture (GL_TEXTURE_2D, texture_id);
glVertexPointer (3, GL_FLOAT, 0, varray);
glTexCoordPointer(2, GL_FLOAT, 0, tarray);
glDrawArrays (GL_TRIANGLE_STRIP, 0, 4);
教えていただきたいことは、
1.はみ出た領域(描画情報128×64に対し描画したい領域は80×40)をマスクして描画されないようにすることは可能か?
2.1が可能な場合、どのように実現するのか?
3.1が不可能な場合、描画領域も80×40としテクスチャを縮小させずに描画させることが可能か?
4.3が可能な場合、どのように実現するのか?

当方、OpenGL ES 1.1を使用するのは今回が初めての初心者です。
何卒ご教示のほどよろしくお願い致します。
情報不足等ありましたら、申し訳ありません。

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

Re: OpenGL ES1.1でのマスク処理について

#2

投稿記事 by ISLe » 14年前

milk-teria さんが書きました:1.はみ出た領域(描画情報128×64に対し描画したい領域は80×40)をマスクして描画されないようにすることは可能か?
2.1が可能な場合、どのように実現するのか?
glEnable(GL_BLEND);
glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
の2行を入れないとアルファ値として合成(半透明合成)が行われないのでは?
はみ出してない部分も背景が抜けていないと思いますけど。
milk-teria さんが書きました:3.1が不可能な場合、描画領域も80×40としテクスチャを縮小させずに描画させることが可能か?
4.3が可能な場合、どのように実現するのか?
tarrayがテクスチャ座標です。
テクスチャ座標はピクセル単位のサイズに関係なく、0f~1fで表します。
要は割り合いなので、128ピクセル幅で80ピクセルの位置は80f/128となり、64ピクセル幅で40ピクセルの位置は40f/64となります。
以下のようにすれば80x40で描画されるはずです。

コード:

float varray[][3] =
{
    {-80/2, -40/2, 0},
    { 80/2, -40/2, 0},
    {-80/2, 40/2, 0},
    { 80/2, 40/2, 0},
};
 
float tarray[][2] =
{
    { 0.0f, 40f/64},
    { 80f/128, 40f/64},
    { 0.0f, 0.0f},
    { 80f/128, 0.0f},
};
1が可能か不可能かの二択ではなくて、どちらも対処すべきですね。

milk-teria

Re: OpenGL ES1.1でのマスク処理について

#3

投稿記事 by milk-teria » 14年前

ISLeさん、たびたびご教示いただきありがとうございます。
教えていただいた内容で、無事、希望通りに描画させることができました。

申し訳ありませんが、もう1点教えていただけないでしょうか

テクスチャの切り出し位置なのですが、あるサイトでは左下が(0,0)になると記載されてあります。
また別のサイトでは左上が(0,0)になるとも記載されてあります。
私が使用している環境では左上が(0,0)のようなのですが、この違いはどういうことなのでしょうか?
また左下を(0,0)にすることは出来るのでしょうか?

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

Re: OpenGL ES1.1でのマスク処理について

#4

投稿記事 by ISLe » 14年前

OpenGLではテクスチャの原点は左下です。
環境によって異なることはありません。

テクスチャのマッピング座標(切り出し位置)の原点が左下であると同時に、ピクセル(画素)の原点も左下です。

glTexImage2Dに渡すグレースケール情報は左上を原点としたイメージですよね。
それを左下原点として取り込むので、作成されるテクスチャは上下が反転したイメージになります。
上下が反転するのでマッピング座標の原点がイメージの左上であるように見えるわけです。

2Dイメージの場合は左上原点で扱ったほうが分かりやすいのではないかと思いますけど。

milk-teria

Re: OpenGL ES1.1でのマスク処理について

#5

投稿記事 by milk-teria » 14年前

ISLeさん、ご回答ありがとうございます。
なかなか複雑ですが、なんとなく分かりました。
現状のまま左上原点で処理を組みたいと思います。
ありがとうございました。

閉鎖

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