質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
86.02%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

OpenGL ES

携帯電話のような組込み機器のためにデザインされたOpenGLのサブセットです。

Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

iOS

iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

解決済

[OpenGL]グレースケールイメージをアルファマスクとして使用できますか?

SNMAGN
SNMAGN

総合スコア12

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

OpenGL ES

携帯電話のような組込み機器のためにデザインされたOpenGLのサブセットです。

Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

iOS

iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

1回答

0グッド

0クリップ

3659閲覧

投稿2016/06/29 03:14

###前提・実現したいこと
OpenGLを使用して背景を透過して画像を画面に表示することを目指しています。
テクスチャを使用して、画面に板状のポリゴンを描画し、画像を表示するところまでは出来ています。
実装上の事情があり、アルファを含んだPNG画像等を使用することが出来ません。
その代わりにアルファ値を表現するグレースケールの画像を使用出来るのですが、この画像を利用して
RGBの値をアルファ値として持つテクスチャを作成できないでしょうか。

最終的には、画像テクスチャとアルファテクスチャの二つを以下のようにブレンディングすることで、
背景を透過した表示(例えばキャラクタの切り抜き等)を実現したいと考えています。

glBlendFuncSeparate(GL_ONE, GL_ZERO, GL_ZERO, GL_ONE);
sを画像テクスチャ、dをアルファテクスチャとする。
(sR * 1, sG * 1, sB * 1, sA * 0) + (sR * 0, sG * 0, sB * 0, sA * 1) = (sR, sG, sB, dA)

###知りたいこと
グレースケール画像から、各画素のR値(またはB、Gでも良い)が各画素のアルファ値になるようなテクスチャを
作成する方法についてご存じの方がいらっしゃいましたらご教授下さい。
宜しくお願い致します。

###補足情報(言語/FW/ツール等のバージョンなど)
他のライブラリの兼ね合いによりOpenGLES1.1Extまでの内容で実装したいと考えています。
よって、シェーダプログラムは利用できません。
また、更新が頻繁に起こるので、配列でのアクセスは極力避けたいと考えています。

以下のような質問にはグッドを送りましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

グッドが多くついた質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

気になる質問をクリップする

クリップした質問は、後からいつでもマイページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

下記のような質問は推奨されていません。

  • 間違っている
  • 質問になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

適切な質問に修正を依頼しましょう。

masaya_ohashi

2016/06/29 05:52

OpenGLES1.1でやるとなると、glActiveTextureなどでマルチテクスチャを管理することになります。そして、端末によってはテクスチャユニットが1つしか無い端末もあります。テクスチャユニットが1つしかないと、2枚のテクスチャを合成することは無理ですが、そこらへんは大丈夫ですか? glGetIntegerv(GL_MAX_TEXTURE_IMAGE_UNITS, &texture_units);でテクスチャユニットの数が調べられます。
SNMAGN

2016/06/29 08:49

masaya_ohashiさん 返信有難うございます。 > テクスチャユニットが1つしかないと、2枚のテクスチャを合成することは無理ですが、そこらへんは大丈夫ですか? ココについては、ちょっと迂遠ですが、FrameBufferObjectに順番に書き込むことで対応できないかと考えています。 FBOに動画テクスチャ、アルファテクスチャの順番で書き込み、アルファテクスチャを書き込む際に、glBlendFuncSeparate(GL_ONE, GL_ZERO, GL_ZERO, GL_ONE);でブレンドできるのではないかと考えています。
masaya_ohashi

2016/06/29 08:58

FBOに対してglCopyTexSubImage2D等で書き込む想定ですか?おそらくアルファ値のみ上書きといった使い方は出来ないかと思いますが…
SNMAGN

2016/06/29 09:16 編集

masaya_ohashiさん 素早い返信有難うございます。 アルファのみの書き込みはやはり難しいのでしょうか... 念の為、構想についてもう少し細かく説明しますと、 グレースケール->アルファ変換用のFBOと合成用のFBOを分けて考えています。 「グレースケールを読込んだテクスチャ」を、「グレースケール->アルファ変換用のFBO」に書き込みます。この時、各画素のR値(グレースケールならB、Gも同じ値だと思われるため)をアルファ値としてFBOに書き込みたいと思っています。 その後、合成用のFBOに画像テクスチャとアルファテクスチャ(「グレースケール->アルファ変換用のFBO」に紐付けたテクスチャ)を順に描画し、OpenGLのブレンド機能を使用して合成する想定です。
masaya_ohashi

2016/06/29 09:34

そこまで手順が考えられておられるなら、実際やってみたらどうでしょう?やってみてもだめだったということですか?
SNMAGN

2016/06/29 09:55

masaya_ohashiさん 返信有難うございます。 今のところFBOへの書き込み処理について、実機でやり方を調べている段階で、グレーススケールからアルファ値への変換については、サンプルプログラムでの検証はまだ行っていません。 しかし、調査段階でRGB値をアルファ値として描画する方法が見つからなかった為、「グレースケールを読込んだテクスチャ」を、「グレースケール->アルファ変換用のFBO」に書き込む部分の実装方法に目途が立たず、質問させていただきました。
masaya_ohashi

2016/06/29 10:43

現状どうやってテクスチャを読み込んでいるか参考に書いていただけますか?glTexImage2dを使っていますか?
SNMAGN

2016/06/29 11:29

masaya_ohashiさん 返信有難うございます。 Androidでの話ですが、glTexImage2dは使用していません。該当の画像の読み込みは実際には動画データなので、javaコードで、SurfaceTexture、Surface、MediaPlayerを使用し、MediaPlayer.setSurface(Surface)によって紐付けて、OpenGLのテクスチャとして読み込んでいます。 その毎フレーム毎の映像を左右に分割して、「元画像」と「グレースケール画像」として扱う予定です。
masaya_ohashi

2016/06/30 00:14

すでにRGBテクスチャとして出来上がっているものをアルファテクスチャとして使いたい、ということなのですね…うーん…GLES2.0なら楽勝なんですがね…
SNMAGN

2016/06/30 00:33

masaya_ohashiさん 返信有難うございます。 やはりOpenGL ES1.1Extまでの内容だと厳しいですか... 時間はかかってしまいますが、OpenGL ES2.0への移行を検討してみます。 プログラマブルシェーダなら、サンプラからの取得を工夫すれば、今回の内容は実装可能だと思いますので。 表題の内容とは異なりますが、OpenGL2.0環境下で実行できるAndroid/iOSで使用可能な、OBJ形式やアニメーション可能な3Dオブジェクト形式の描画ができるライブラリ等をご存知でしたら、ご紹介いただけないでしょうか。
masaya_ohashi

2016/06/30 00:56

私がOpenGLES2.0を触ったのは研究目的だったので、ライブラリ等は詳しくないのです…申し訳ありません。しかし、回答にも書いたように、SNMAGNさんと同じ考え方で実現しようとしているものを発見しました。参考にどうぞ。

回答1

1

ベストアンサー

ようやく同じことを探した質問を見つけました。あなたのやろうとしている、フレームバッファ内で合成する方法のようです。
http://gamedev.stackexchange.com/questions/75589/is-there-a-way-to-use-the-rgb-channels-of-a-texture-as-the-alpha-channel-when-ap

投稿2016/06/30 00:54

masaya_ohashi

総合スコア9198

SNMAGN👍を押しています

良いと思った回答にはグッドを送りましょう。
グッドが多くついた回答ほどページの上位に表示されるので、他の人が素晴らしい回答を見つけやすくなります。

下記のような回答は推奨されていません。

  • 間違っている回答
  • 質問の回答になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

このような回答には修正を依頼しましょう。

回答へのコメント

SNMAGN

2016/06/30 01:50

ご回答有難うございます。 今後はリンク先の内容を確認して、実験してみます。ダメならOpenGLES2.0での実装を改めて検討してみます。 長くお付き合いいただきまして、助かりました。重ねて御礼申し上げます。

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
86.02%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問

同じタグがついた質問を見る

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

OpenGL ES

携帯電話のような組込み機器のためにデザインされたOpenGLのサブセットです。

Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

iOS

iOSとは、Apple製のスマートフォンであるiPhoneやタブレット端末のiPadに搭載しているオペレーションシステム(OS)です。その他にもiPod touch・Apple TVにも搭載されています。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。