1

OpenGL ES 2.0 を使用する Android では、さまざまな内部テクスチャ フォーマットを使用して特定のパフォーマンス テストを実行しようとしています。最初は、OpenGL を使用して別の形式 (RGB や LUMINANCE など) で内部的に読み込んで保存したい RGBA テクスチャ (png) がたくさんあります。次のように glTexImage2D を使用してテクスチャをロードします。

Bitmap bitmap = BitmapFactory.decodeResource(context.getResources(),resourceId);
...
int size = bitmap.getRowBytes() * bitmap.getHeight();
ByteBuffer b = ByteBuffer.allocate(size);
bitmap.copyPixelsToBuffer(b);
GLES20.glTexImage2D(GLES20.GL_TEXTURE_2D, 0, GLES20.GL_RGBA, bitmap.getWidth(),    
                    bitmap.getHeight(), 0, GLES20.GL_RGBA, 
                    GLES20.GL_UNSIGNED_BYTE, b);

これは問題なく動作しますが、最初の GLES20.GL_RGBA (内部フォーマット パラメータ) を別のもの (GLES20.GL_RGB または GLES20.GL_LUMINANCE) に変更すると、テクスチャがすべて黒く表示されます。2 番目の GLES20.GL_RGBA を同じ値に変更すると、何かが表示されますが、元のデータが RGBA であるため、明らかに正しくありません。

おそらくテクスチャの内部フォーマットが異なるため、おそらく texture2D(..) は異なる値を返します。私のシェーダーコードは単純です:

gl_FragColor = texture2D(texture, fragment_texture_coordinate);

これも変更してみましたが、まだうまくいきません。したがって、glTex2DImage は、私が思っているようにまったく機能していないのではないかと思いました (私はこの分野の専門家ではありません)。

私は何を間違っていますか?

編集: texImage2Dのこの小さな詳細を見落としていました。次のように表示されます。

internalformat は format と一致する必要があります。テクスチャ イメージの処理中は、フォーマット間の変換はサポートされていません。type は、必要な精度を指定するためのヒントとして使用できますが、GL 実装では、選択した任意の内部解像度でテクスチャ配列を格納することを選択できます。

このことから私が収集したのは、テクスチャを元の形式とは異なる形式で保存したい場合は、自分で変換する必要があるということです。

4

1 に答える 1

0

フラグメント シェーダーは、glTexImage2D() に指定する形式に一致するように記述する必要があります。GL_RGB の場合、次のようにアルファを強制的に 1.0 にする必要があります。

vec3 Color_RGB = texture2D(sampler2d, texCoordinate);
gl_FragColor = vec4(Color_RGB, 1.0);

ただし、GL_RGBA の場合は次のようになります。

vec4 Color_RGBA = texture2D(sampler2d, texCoordinate);
gl_FragColor = Color_RGBA;

また、既に説明したように、PNG ファイルに透過性がない場合は、Android Bitmap クラスのみをテクスチャに使用できます。この記事では次のように説明しています: http://software.intel.com/en-us/articles/porting-opengl-games-to-android-on-intel-atom-processors-part-1

于 2013-06-12T02:08:32.083 に答える