java - 在 Java 中创建的半透明或透明图像在 Android OpenGL ES 中不显示

标签 java android image opengl-es

我使用 Mac 计算机使用以下代码在 Java 6 中创建图像。然后,我尝试使用 OpenGL ES 在 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);

}

最佳答案

您能否发布对 glDrawElements()glDrawArrays() 的实际调用?如果不查看实际的 OpenGL 绘制调用,很难说出您做错了什么。但是在绘制纹理之前您可能没有启用混合。

像这样的东西应该可以解决问题:

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

看看this question如果您想了解更多信息。

编辑:

我错了,我误读了你的问题。您应该查看正在使用的 BufferedImage 格式。 TYPE_BYTE_INDEXED 似乎不支持基于 the documentation 的 alpha 值.您是否尝试过使用 TYPE_INT_ARGB 代替?

关于java - 在 Java 中创建的半透明或透明图像在 Android OpenGL ES 中不显示,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10115817/

相关文章:

java - 我可以在 Synology NAS 中部署 Java Spring-Boot 应用程序吗?

java - Android 联系人列表选择器

java - 在运行时在标签中显示图像

java - 在 Java 中,为什么这个数组声明可以编译?

java - 仅使用根 XSD 验证 XML (Java)

android - 当应用程序在后台使用 firebase 时,使推送通知显示为弹出窗口

android - 对android联系人的频繁查询返回null

python - 为什么在 PIL(low) 中读取图像会破坏 Flask 图像终点?

java - 图像分辨率 vs 屏幕分辨率 vs 相机分辨率

java - 如何在 Spring-data-elasticsearch 中禁用页面查询