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);
}