android opengl glutils.teximage2d,android – 纹理中的GLUtils.texImage2D和Alpha问题

alpha通道是我所能说的大量程序员的不良受虐待的继子…但如果你这样做,上传工作效率相当高:

>估计最大的纹理(如1024×1024)并创建一个大小为(1024 * 1024)的int数组,存储在某个静态变量中或者可以访问它的地方,这样就不需要重新创建该数组(分配时间)这里很珍贵)

>然后这样做:

bitmap.getPixels(pixels, 0, width, 0, 0, width, height);

gl.glTexImage2D(GL10.GL_TEXTURE_2D, 0, GL10.GL_RGBA, width, height,

0, GL10.GL_RGBA, GL10.GL_UNSIGNED_BYTE, IntBuffer.wrap(pixels));

我很抱歉没有找到不同的解决方案…最初的问题是,GLUtils.texImage2D函数的实现者错误地处理了alpha通道,当图像显示得比它大时,会导致黑色边框(双线性滤波器计算四个像素之间的颜色以及当具有透明alpha的像素的rgb值被破坏时(如设置为黑色),结果是,在那里形成的透明边界上发生了某种“颜色渗色”.非常难看.也许是为了提高压缩率,因为PSD中alpha透明区域的RGB值包含大量垃圾,当消除时会为压缩算法带来很大的改进空间)

编辑:遗憾的是,这种方法仅适用于灰度图像,因为从位图中获取像素时交换红色和蓝色通道.至少在我的设备上.我不确定这对于其他设备有多正确,但在我的情况下,这就是诀窍:

for (int i=0;i

int argb = pixels[i];

pixels[i] = argb&0xff00ff00 | ((argb&0xff)<<16) | ((argb>>16)&0xff);

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值