1

我在我的应用程序中使用 GLES20 纹理,我正在加载它的texImage2D功能。有时我必须使用动态创建的位图修改加载纹理的一小部分区域。位图包含透明度(某些像素的 alpha < 255)。当我调用函数texSubImage2D时,alpha 值 < 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 纹理上绘制具有透明像素的位图?

4

1 回答 1

1

我认为最简单的方法是:

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

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

于 2013-07-23T02:22:54.450 回答