用包含alpha的位图替换纹理像素(函数texSubImage2D)

时间:2013-07-22 16:43:58

标签: android opengl-es textures

我在我的应用程序中使用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纹理上绘制带透明像素的位图?

1 个答案:

答案 0 :(得分:1)

我认为最简单的方法是:

  • 将整个纹理的副本保留为Bitmap并使用您想要的任何mode绘制到该纹理。
  • 您更改的位图部分的
  • Make a copy(或更新现有的位图以避免每次分配内存)。
  • 使用glTexSubImage2D使用适当的x和y offset上传较小的位图。

您必须复制到较小位图的原因是glTexSubImage2D不支持上传位图的部分(矩形)。但它允许您使用offset参数更新纹理的一部分。