我在我的应用程序中使用GLES20纹理,我正在加载texImage2D
函数。有时我必须使用我在运行中创建的位图来修改加载纹理的小区域。位图包含透明度(某些像素的alpha <255)。当我调用函数texSubImage2D
时,alpha值大于&lt; 255被黑色像素替换。
我的代码(我删除了不相关的部分)如下所示:
// Set blending function
GLES20.glEnable(GLES20.GL_BLEND);
GLES20.glBlendFunc(GLES20.GL_SRC_ALPHA, GLES20.GL_ONE_MINUS_SRC_ALPHA);
// Create bitmap
Bitmap bitmap = Bitmap.createBitmap(20, 20, Config.ARGB_8888);
// Draw on the bitmap
Canvas c = new Canvas(bitmp);
Paint paint = new Paint();
paint.setStyle(Style.FILL_AND_STROKE);
paint.setColor(Color.argb(100, 255, 0, 0));
c.drawRect(0, 0, 20, 20, paint);
// Bind to the texture I want to modify
GLES20.glBindTexture(GLES20.GL_TEXTURE_2D, textureId);
// Draw on the texture
GLUtils.texSubImage2D(GLES20.GL_TEXTURE_2D, 0, myX, myY, bitmap);
// Free memory
bitmap.recycle();
如果我使用255 alpha(将paint.setColor(Color.argb(100, 255, 0, 0));
更改为paint.setColor(Color.argb(255, 255, 0, 0));
),那么一切正常,但当然会丢失alpha。
如何在不丢失透明度的情况下在GLES20纹理上绘制带透明像素的位图?
答案 0 :(得分:1)
我认为最简单的方法是:
Bitmap
并使用您想要的任何mode绘制到该纹理。 offset
上传较小的位图。您必须复制到较小位图的原因是glTexSubImage2D
不支持上传位图的部分(矩形)。但它允许您使用offset
参数更新纹理的一部分。