【发布时间】:2014-05-30 12:59:17
【问题描述】:
目前我正在研究具有透明度的动态纹理(即在运行时创建)。我当前创建的位图如下所示:
b = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888);
final Canvas c = new Canvas(b);
c.drawColor(0, PorterDuff.Mode.CLEAR);
view.layout(0, 0, view.getMeasuredWidth(), view.getMeasuredHeight());
c.save();
c.translate(paddingLeft, paddingTop);
view.draw(c);
c.restore();
因为我正在创建一个视图,我需要它作为位图,然后将其用作平面的纹理。这工作得很好,我收到一个位图。如果我将它添加到 ImageView 中并将其放在我的布局之上,它也是透明的,据我所知。
我在我的GLSurfaceView 和setEGLConfigChooser(8,8,8,8,16,0); 中使用getHolder().setFormat(PixelFormat.TRANSLUCENT);。
纹理的生成是这样的:
GLES20.glGenTextures(1, textureHandle, 0);
GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, textureHandle[0]);
// GLES20 tex parameters here as well... (min/mag filter)
GLUtils.texImage2D(GLES20.GL_TEXTURE_2D, 0, GLES20.GL_RGBA, bmp, 0);
在片段着色器中,我 - 出于测试目的 - 只是应用
gl_FragColor = texture2D(u_Texture, v_TexCoordinate);
所以没有灯光,只取纹理的颜色。
但它不是透明的,它有黑色边框 - 因为我将位图创建为 2 的幂。这意味着,如果我的视图大小是例如300x300,纹理为 512x512,带有透明边框 - 在 OpenGL ES 2.0 中绘制为黑色。
在我的渲染器中,我启用混合如下:
GLES20.glClearColor(0, 0, 0, 0);
GLES20.glEnable(GLES20.GL_DEPTH_TEST);
GLES20.glEnable(GLES20.GL_CULL_FACE);
GLES20.glEnable(GLES20.GL_BLEND);
GLES20.glBlendFunc(GLES20.GL_SRC_ALPHA, GLES20.GL_ONE_MINUS_SRC_ALPHA);
GLES20.glCullFace(GLES20.GL_BACK);
GLES20.glDepthFunc(GLES20.GL_LEQUAL);
但我不确定这是否是正确的搅拌机功能。
所以最后,透明度被忽略,显示为黑色。
任何想法我可能会错过/做错什么?非常感谢。
【问题讨论】:
标签: java android bitmap opengl-es-2.0 transparency