2012-04-12 9 views
3

Java 6で画像を作成するには、次のコードを持つMacコンピュータを使用します。私はOpenGL ESを使ってAndroidデバイスにその画像を表示しようとします。画像が表示されず、白い画像のみが表示されます。ただし、半透明のピクセルがない場合、画像はきれいに表示されます。Javaで作成された半透明または透明の画像がAndroid OpenGL ESに表示されない

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); 

} 
+0

イメージを読み込んでテクスチャを作成するために使用するコードを表示できますか?特にglTexImage2Dコール – haffax

答えて

0

Javaで作成された透過画像がAndroid OpenGL ESでうまくいかない理由はまだ分かりません。しかし、私はイメージが動作するようにハックを見つけました。あなたはJavaで、あなたの新しい透明なイメージを作成

は、あなたが最初にすべきことは

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

// gはGraphicsオブジェクトを取得するメソッドの呼び出しを使用して、その上に半透明の画像を描画することです新しいイメージから

// IMG引数は、Photoshopで作成した半透明のではなく、100%透明(またはそうでなければ動作しません)画像で作成されています。私は目立たないように4x4サイズを使用します。

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

私の推測では、半透明の画像を描画することで、それが生成されたPNGファイルの形式を変更し、このフォーマットの変更は、それは、AndroidのOpenGL ESで働くなることです。

1

あなたはglDrawElements()またはglDrawArrays()への実際の呼び出しを投稿することができますか?実際のOpenGL描画呼び出しを見ずに間違っていることを伝えるのは難しいです。しかし、テクスチャを描画する前にブレンドを有効にしていない可能性があります。このような

何かがトリックを行う必要があります:あなたは少しより多くの情報が必要な場合

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

this questionを見てみましょう。

EDIT:

私のミス、私はあなたの質問を読み違えます。使用しているBufferedImageフォーマットを見てください。 TYPE_BYTE_INDEXEDは、the documentationに基づくアルファ値をサポートしていないようです。代わりにTYPE_INT_ARGBを使用してみましたか?

+0

答えてくれてありがとう。私はブレンドを可能にしています。前述したように、半透明のテクスチャのレンダリングは、Photoshopを使用して作成された半透明の画像でうまく機能します。 – Felipe

+0

申し訳ありませんが、私は質問を誤解しました。私は私の答えを更新しました。 – theisenp

関連する問題