4

OpenGL ES 2.0 を使用する iOS アプリを作成しています。私は OpenGL に少し慣れていないので、これは些細な間違いかもしれません。

アルファ チャネルを使用して、あるテクスチャを別のテクスチャでマスキングするための単純なシェーダを作成しました。マスク テクスチャは次のように初期化されます。

glGenTextures(1, &name); glBindTexture(GL_TEXTURE_2D、名前);

glTexParameterf(GL_TEXTURE_2D, GL_GENERATE_MIPMAP, GL_TRUE); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR ); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE );

glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 1024, 768, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0);

glGenFramebuffersOES(1, &buffer); glBindFramebufferOES(GL_FRAMEBUFFER_OES, バッファ);

glFramebufferTexture2DOES(GL_FRAMEBUFFER_OES, GL_COLOR_ATTACHMENT0_OES, GL_TEXTURE_2D, 名前, 0);

glBindFramebufferOES(GL_FRAMEBUFFER_OES, 0);

次に (後で) マスク テクスチャに何かを描画し、マスク テクスチャをこのフラグメント シェーダにリンクして別のテクスチャに適用します。

uniform sampler2D baseTextureSampler;
uniform sampler2D maskTextureSampler;
varying lowp vec4 colorVarying;
varying mediump vec2 textureCoordsVarying;  
varying mediump vec2 positionVarying; 

void main() {

      lowp vec4 texel = texture2D(baseTextureSampler, textureCoordsVarying);
      lowp vec4 maskTexel = texture2D(maskTextureSampler, positionVarying);

      gl_FragColor = texel*colorVarying*maskTexel.a; 
}

これは、私が望む方法を正確にレンダリングします。ただし、マスク テクスチャのバッファをバインドする際のオーバーヘッド (かなりの量のようです) を減らすために、マスク テクスチャに 8 ビットのアルファのみのピクセル フォーマットを使用しようとしています。しかし、RGBA セットアップからコードを変更すると、次のようになります。

glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, 1024, 768, 0, GL_RGBA, GL_UNSIGNED_BYTE, 0);

...アルファのみに:

glTexImage2D(GL_TEXTURE_2D, 0, GL_ALPHA, 1024, 768, 0, GL_ALPHA, GL_UNSIGNED_BYTE, バッファ);

...フラグメントシェーダーは何も描画できません。そもそもマスク テクスチャのアルファしか使用していないので、引き続き機能するはずです。なぜそうしないのか、何か考えはありますか?

4

1 に答える 1

2

OpenGL ES 2.0 仕様 (または GL_OES_framebuffer_object 拡張機能) では、アルファ ビットのみのレンダリング可能な形式が定義されていないため、サポートされていません。RGBA 形式を使用する必要があります。

于 2011-03-04T04:09:16.420 に答える