2017-09-17 9 views
1

私はルミネッセンスアルファテクスチャを持っています。各ピクセルは2バイトあり、最初のバイトはルミネセンスで、2番目のバイトはアルファです。OpenGL:Luminence + Alphaに似た16ビット内部フォーマットが可能ですか?

緑と青のチャンネルのテクスチャメモリを無駄にすることなく、(フラグメントシェーダ内で)アルファコンポーネントが常に使用されるテクスチャに関係なくアルファを参照するようにGPUにアップロードすることはできますか?これは私が32ビットRGBAテクスチャのためのシェーダ内の別々のコードパスを使用する必要になる、と私は制服/条件を設定しないようにしたいと思いますので、

// fragment shader 
vec4 px = texture(tex, uv); 
px.r; // is luminescence 
px.a; // is alpha (note that .a is used, not .g which would be green for 32bit RGBA textures) 

私は内部形式としてGL_RGを使用しないようにしたい理由は、あります異なるテクスチャタイプ。

答えて

5

私は避けたい理由(一般的なGPUがGおよびBチャネルのメモリのオーバーヘッドを排除することができるならば、彼らは/空RGBA内部フォーマットのための冗長している場合、それはあまりにも大丈夫だろう)内部フォーマットとしてGL_RGを使用するのは、32ビットRGBAテクスチャのシェーダ内で別のコードパスを使用する必要があるからです。

内部フォーマットは、テクスチャに格納されているコンポーネントを定義します。ただし、取り出すものはswizzle mask for the textureを使って調整できます。

GLint swizzleMask[] = {GL_RED, GL_RED, GL_RED, GL_GREEN}; 
glTexParameteriv(GL_TEXTURE_2D, GL_TEXTURE_SWIZZLE_RGBA, swizzleMask); 
+0

テクスチャをバインドするたびにスウィズルを設定する必要がありますか、最初にアップロードしたときに1回だけテクスチャを設定する必要がありますか? (スウィズル状態がテクスチャにあるのか、それともグローバルなのか分かりません) –

+0

ああ、ちょうど試してみましたが、テクスチャの状態です。 –

+0

@AnneQuinn: "*私はちょうど試しました*"または私が投稿したリンクを読んで、そのセクションの最上部で "テクスチャパラメータ"がテクスチャオブジェクトの状態の一部であることを非常に明確にします。 –

関連する問題