3

以下のコードを使用してMacコンピューターを使用してJava6でイメージを作成します。次に、OpenGLESを使用してAndroidデバイスにその画像を表示しようとします。画像は表示されず、白い画像のみが表示されます。ただし、半透明のピクセルがない場合、画像は正常に表示されます。

Photoshopで作成した半透明の画像を表示しても問題ありません。私が問題を抱えているのは、Javaで作成された半透明の画像だけです。また、Javaを使用して半透明の画像を作成するさまざまな方法を試しましたが、常に同じ結果が得られ、OpenGLで白い画像が表示されます。この時点で、これはJavaのバグだと思います(Macコンピューターの場合)。誰かがこのようなことに遭遇したことがありますか?なぜこれが起こっているのか考えていますか?

//画像を作成するためのコード

int cmap[] = { 
0x00000000, /*transparent*/ 
0xFF000000, /*black*/ 
0xFFFF0000, /*red*/ 
0xFFFFFF00, /*yellow*/ 
0xFF00FF00, /*green*/ 
//...... 
}; 
IndexColorModel colorModel = new IndexColorModel(8, 
cmap.length, cmap, 0, true, -1, DataBuffer.TYPE_BYTE); 
BufferedImage image = new BufferedImage(256, 256, 
BufferedImage.TYPE_BYTE_INDEXED, colorModel); 
Graphics2D g = image.createGraphics(); 
g.setBackground(new Color(0,0,0,0)); /*transparent*/ 
g.clearRect(0 , 0, image.getWidth(), image.getHeight()); 
g.setColor(Color.red); 
g.draw(new Rectangle(10, 10, 40, 40));


ImageIO.write(image, "PNG", new File("rectangle.png")); 

以下は、テクスチャをロードするためのコードです。これはAndroid環境に固有であることに注意してください。

public static void loadAndBindTexture(GL10 gl) throws Exception
{ 
    int numberTextures=1;
    int[] textures = new int[numberTextures];
    gl.glGenTextures(numberTextures, textures, 0);
    int textureID=textures[0];

    gl.glBindTexture(GL10.GL_TEXTURE_2D, textureID);//polyBreaker3DObject_.mTextureID);

    checkGLError(gl, 998);
    gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_MIN_FILTER, GL10.GL_LINEAR_MIPMAP_LINEAR);
    checkGLError(gl, 997);
    //NOTE: FOR GL_TEXTURE_MAG_FILTER only GL_NEAREST or GL_LINEAR are valid.
    gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_MAG_FILTER, GL10.GL_LINEAR);
    checkGLError(gl, 996);

    /*Commented on Sept. 30, 2010 6:21AM
    gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_MIN_FILTER,GL10.GL_NEAREST);
    gl.glTexParameterf(GL10.GL_TEXTURE_2D,GL10.GL_TEXTURE_MAG_FILTER,GL10.GL_LINEAR);
    */
    gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_WRAP_S,GL10.GL_CLAMP_TO_EDGE);
    gl.glTexParameterf(GL10.GL_TEXTURE_2D, GL10.GL_TEXTURE_WRAP_T,GL10.GL_CLAMP_TO_EDGE);
    checkGLError(gl, 1000);

    gl.glTexEnvf(GL10.GL_TEXTURE_ENV, GL10.GL_TEXTURE_ENV_MODE,GL10.GL_DECAL);
    checkGLError(gl, 1001);
    gl.glTexParameterf(GL11.GL_TEXTURE_2D, GL11.GL_GENERATE_MIPMAP, GL11.GL_TRUE);
    checkGLError(gl, 1002);


 if(mContext==null)//mContext is the Context of the current Android application (it is set before this method is called
    throw new Exception("Context has not been set.");
 InputStream is = mContext.getResources().openRawResource(R.drawable.metal128x128);//blueski);//robot);
Bitmap bitmap;
try {

    bitmap = BitmapFactory.decodeStream(is);

} finally {
    try {
        is.close();
    } catch(IOException e) {
        Log.printCaughtExceptionMsg(e);
    }
}

GLUtils.texImage2D(GL10.GL_TEXTURE_2D, 0, bitmap, 0);
bitmap.recycle();

   checkGLError(gl, 1003);

}
4

2 に答える 2

1

またはへの実際の呼び出しを投稿できますglDrawElements()glDrawArrays()? 実際の OpenGL ドローコールを見ずに、何が間違っているのかを判断するのは困難です。ただし、テクスチャを描画する前にブレンドを有効にしていない可能性があります。

このような何かがうまくいくはずです:

gl.glBlendFunc(GL10.GL_SRC_ALPHA, GL10.GL_ONE_MINUS_SRC_ALPHA);
gl.glEnable(GL10.GL_BLEND);

もう少し情報が必要な場合は、この質問を見てください。

編集:

私の間違いです、私はあなたの質問を読み違えました。使用している BufferedImage 形式を確認する必要があります。 ドキュメントTYPE_BYTE_INDEXEDに基づいてアルファ値をサポートしていないようです。代わりに使ってみましたか?TYPE_INT_ARGB

于 2012-04-13T17:57:21.710 に答える
0

Java で作成された透明なイメージが Android OpenGL ES で機能しない理由をまだ理解できていません。ただし、画像を機能させるハックを見つけました。

Java で新しい透明画像を作成する場合、最初にすべきことは、メソッド呼び出しを使用して半透明画像を描画することです。

        g.drawImage(Image img, x, y,  null);

//g は、作成中の新しい画像から取得した Graphics オブジェクトです

//img 引数は、Photoshop で作成された 100% 透明 (または機能しない) 画像ではなく、半透明です。目立たないように4×4サイズを使用しています。

この呼び出しの後、元のコードの実行を続行できます。新しいイメージは、Android OpenGL ES で動作するようになりました。

私の推測では、半透明の画像を描画すると、生成される PNG ファイルの形式が変更され、この形式の変更により、Android OpenGL ES で動作するようになります。

于 2012-04-13T17:56:22.430 に答える