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

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

新規登録して質問してみよう
ただいま回答率
85.48%
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

解決済

1回答

4395閲覧

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

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つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

0クリップ

投稿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までの内容で実装したいと考えています。
よって、シェーダプログラムは利用できません。
また、更新が頻繁に起こるので、配列でのアクセスは極力避けたいと考えています。

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

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さんと同じ考え方で実現しようとしているものを発見しました。参考にどうぞ。
guest

回答1

0

ベストアンサー

ようやく同じことを探した質問を見つけました。あなたのやろうとしている、フレームバッファ内で合成する方法のようです。
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

総合スコア9206

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

SNMAGN

2016/06/30 01:50

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問